Mutex или не Mutex? - PullRequest
       16

Mutex или не Mutex?

5 голосов
/ 19 января 2010

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

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

Ответы [ 5 ]

10 голосов
/ 19 января 2010

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

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

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

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

1 голос
/ 19 января 2010

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

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

1 голос
/ 19 января 2010

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

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

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

1 голос
/ 19 января 2010

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

Этого можно избежать, очень тщательно кодируя обновления, но способ создания кодаустойчивость к будущим изменениям обновлений заключается в использовании мьютекса.

0 голосов
/ 18 ноября 2012

Ваш вопрос зависит от двух условий:

  1. есть только два потока, один - производитель, другой - потребитель
  2. Конструкция рассчитана на отсутствие блокировки

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

...