К взаимному исключению или не к взаимному исключению?

Мне нужно взаимное исключение, если у меня есть только одно средство чтения и одно устройство записи? Читатель принимает следующее управление (food.front()) от очереди и выполняет задачу на основе команды. После того, как команда выполняется, она появляется от команды. Писатель очереди продвигает команды на очередь (food.push()).

Мне нужно взаимное исключение? Мой читатель (потребитель) только выполняется если food.size() > 0. Я использую поток читателя и отправляю поток.

5
задан 19 January 2010 в 18:28
поделиться

4 ответа

MOTEX используется в многопоточных средах. Я не вижу упоминания о потоках в вашем вопросе, поэтому я не вижу необходимости в Mutex.

Однако, если мы предположим, что читатель и писатель, вы имеете в виду, что у вас есть два потока, вам необходимо защитить взаимные данные с Mutex (или другой многопоточной схемой защиты.)

Что происходит, когда очередь имеет элементы, а также Читательская нить выключается что-то, пока писательская тема что-то ставит? Катастрофа! С Mutex вы будете уверены, что только один поток работает на очередь одновременно.

Другой метод - это безопасная в очередь без замка. Это будет использовать атомные операции, чтобы гарантировать, что данные не управляются неправильно.

10
ответ дан 18 December 2019 в 14:46
поделиться

Предполагая, что «писатель» и «читатель» находятся в отдельных потоках:

, скорее всего, да: у вас может быть «метастабильное» состояние между «письменным» событием и событием «чтения», где указатели на Структуры являются последовательными.

Конечно, это зависит от реализации: если атомная операция используется для обновления указателей, вы можете быть хорошим без мьютекса.

1
ответ дан 18 December 2019 в 14:46
поделиться

Что произойдет, если читатель видит размер больше нуля, но структура еще не полностью обновляется?

, которые можно избежать, очень тщательно кодируя обновления, но как Чтобы сделать код устойчивым к будущему TAMPERING обновления - использовать Mutex.

1
ответ дан 18 December 2019 в 14:46
поделиться

полностью зависит от реализации, если у вас есть два разных потока, доступ к тем же переменным, вам понадобится мьютекс. В противном случае вы можете, например, в конечном итоге с непоследовательным количеством.

Скажите, что в напишите, что вы делаете ++, и в чтении вы делаете --count и скажем, текущее значение равно 2. Теперь обратите внимание, что эти операторы не должны быть атомными, подсчет ++ может состоять из количества переменной чтения, увеличивая его, а затем снова писать его обратно. Нет записи и чтения одновременно выполняются и говорят, что первый бит записи выполняется (т. Е. Это загружает значение 2. Тогда целое чтение выполняется уменьшением счетчика, но другой поток все еще имел значение 2, которое он увеличивает значение 2 И впоследствии пишет обратно в переменную. Теперь вы только что потеряли действие чтения.

1
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: