Можно ли избежать гонки ожидания пробуждения, используя только семафоры POSIX? Это доброкачественно? - PullRequest
0 голосов
/ 10 декабря 2008

Я бы хотел использовать семафоры POSIX для управления атомарным получением и положением из файла, представляющего очередь. Я хочу, чтобы в файловой системе было что-то поименовано, чтобы совершенно не связанные процессы могли совместно использовать очередь. Я думаю, что этот план исключает pthreads. Названные семафоры posix отлично подходят для размещения в файловой системе того, что может увидеть любой процесс, но я не могу найти стандартный примитив CondWait:

... decide we have to wait ....
CondWait(sem, cond);

Когда CondWait вызывается процессом, он атомарно отправляет в sem и ждет на cond. Когда какой-то другой процесс отправляет сообщение в cond, процесс ожидания активируется, только если он может также атомарно уменьшить sem. Альтернатива

... decide we have to wait ....
sem_post(sem);
sem_wait(cond);
sem_wait(sem);

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

Я вряд ли когда-либо занимался параллельным программированием, поэтому я подумал, что могу спросить SO: если я использую стандартный семафор подсчета POSIX для условной переменной, возможно ли, что эта гонка доброкачественная?

На всякий случай, если кому-то нужен более широкий контекст, я создаю операции get и put для атомарной очереди, которую можно вызывать из сценариев оболочки.

Ответы [ 4 ]

2 голосов
/ 13 декабря 2008

Поскольку других ответов нет, я поделюсь тем, что узнал:

  • Pthreads не будет работать с моим приложением, потому что у меня есть процессы без общего предка, которым нужно совместно использовать атомарную очередь.
  • Семафоры Posix * подвержены гонке в ожидании пробуждения, но поскольку в отличие от классических переменных условия они считают семафоры , гонка является доброкачественной. У меня нет доказательств этого утверждения, но у меня система работает уже два дня и работает хорошо. (Я знаю, что это совершенно бессмысленно, но, по крайней мере, это означало, что я выполнил свою работу.)
  • Именованные семафоры Posix трудны для сбора мусора из файловой системы .

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

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

0 голосов
/ 04 августа 2011

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

0 голосов
/ 20 декабря 2008

В соответствии со стандартом POSIX набор семафорных процедур:

  • sem_close ()
  • sem_destroy ()
  • sem_getvalue ()
  • sem_init ()
  • sem_open ()
  • sem_post ()
  • sem_timedwait ()
  • sem_trywait ()
  • sem_wait ()

Возможно, вам нужны функции sem_trywait() и sem_timedwait().

0 голосов
/ 10 декабря 2008

Вы ищете: pthread_cond_wait, pthread_cond_signal, я думаю.
Вот если вы используете потоки posix, то методы pthread предоставят функциональность CondWait и Signal.
Посмотрите здесь исходный код многопроцессорных потоков через общую память.
http://linux.die.net/man/3/pthread_mutexattr_init
Это для Linux, но документы posix. Они похожи на Solaris, но вы захотите просмотреть справочные страницы в вашей ОС.

...