Я синхронизирую процессы чтения и записи в Linux.
У меня 0 или более процессов (читателей), которым нужно спать, пока они не проснутся, не прочитают ресурс, не вернутся в спящий режим и так далее. Пожалуйста, обратите внимание, я не знаю, сколько процессов чтения в любой момент.
У меня есть один процесс (писатель), который пишет на ресурсе, пробуждает читателей и делает свое дело, пока другой ресурс не будет готов (подробно я разработал решение для не голодных читателей и писателей, но это не важно).
Для реализации механизма сна / пробуждения я использую значение условия Posix, pthread_cond_t. Клиенты вызывают pthread_cond_wait () для переменной для сна, в то время как сервер выполняет pthread_cond_broadcast (), чтобы разбудить их всех. Как сказано в руководстве, эти два вызова окружены блокировкой / разблокировкой соответствующего мьютекса pthread.
Переменная условия и мьютекс инициализируются на сервере и распределяются между процессами через общую область памяти (потому что я работаю не с потоками, а с отдельными процессами), и я уверен, что мое ядро / системный вызов поддерживают это ( потому что я проверил _POSIX_THREAD_PROCESS_SHARED).
Что происходит, так это то, что первый клиентский процесс спит и прекрасно просыпается. Когда я запускаю второй процесс, он блокирует свои функции pthread_cond_wait () и никогда не просыпается, даже если я уверен (по логам), что pthread_cond_broadcast () вызван.
Если я убиваю первый процесс и запускаю другой, он работает отлично. Другими словами, условная переменная pthread_cond_broadcast (), кажется, пробуждает только один процесс за раз. Если несколько и более процессов ожидают одну и ту же переменную общего условия, только первый из них удастся правильно разбудить, а другие, по-видимому, просто проигнорируют передачу.
Почему это поведение? Если я отправлю pthread_cond_broadcast (), каждый процесс ожидания должен проснуться, а не только один (и, тем не менее, не всегда один и тот же).