Многопроцессорная синхронизация - лучший выбор, чем семафоры? - PullRequest
4 голосов
/ 30 августа 2009

У меня есть ресурс очереди, который совместно используется несколькими производителями и несколькими потребителями. Все это независимые процессы; ни один процесс не "владеет" очередью.

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

Я полагал, что использование семафоров с именем POSIX было бы правильным решением, однако некоторые детали меня беспокоят. (Это реализация только для Linux, кстати.)

  1. Когда (если когда-либо) я должен сделать sem_unlink? Есть ли причина фактически удалять очередь?

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

  3. Есть ли лучшее решение для такой простой бинарной блокировки? Возможно, файл блокировки с использованием fcntl и / или эксклюзивных открытий?

1 Ответ

3 голосов
/ 30 августа 2009

Блокировки файлов имеют преимущество разблокировки в случае неожиданной остановки процесса. Я думаю, что они лучше всего подходят для вашего сценария.

Я могу представить себе использование семафоров, когда мне нужна более сложная семантика, которую они поддерживают (они не только поддерживают использование мьютекса, которое вы имеете в виду), но если я их использую, мне нужен какой-то способ ведения домашнего хозяйства в случае преждевременной смерти , Я заметил, что в Lotus Notes в Windows есть хаскир "ZapNotes", который приводит в порядок то, что, как я полагаю, похоже на сценарий "не должно происходить".

...