Я синхронизирую процессы чтения и записи в Linux.переменные условия pthread в Linux, нечетное поведение
У меня 0 или более процессов (читателей), которым нужно спать до тех пор, пока они не проснутся, не прочитают ресурс, не вернутся спать и так далее. Обратите внимание: я не знаю, сколько процессов чтения в любой момент. У меня есть один процесс (писатель), который пишет на ресурсе, пробуждает читателей и делает свой бизнес до тех пор, пока не будет готов другой ресурс (в деталях, я разработал не голодное решение для читателей-писателей, но это не важно).
Для реализации механизма сна/пробуждения я использую значение условия Posix, pthread_cond_t. Клиенты вызывают pthread_cond_wait() для переменной, чтобы спать, а сервер выполняет pthread_cond_broadcast(), чтобы разбудить их всех. Как говорится в руководстве, я окружаю эти два вызова с помощью блокировки/разблокировки связанного мьютекса pthread.
Переменная условия и мьютексы инициализируются на сервере и распределяются между процессами через разделяемую область памяти (поскольку я не работаю с потоками, но с отдельными процессами), я уверен, что мое ядро / syscall поддерживает его (потому что я проверил _POSIX_THREAD_PROCESS_SHARED).
Что происходит, так это то, что первый клиентский процесс спит и просыпается отлично. Когда я запускаю второй процесс, он блокирует его pthread_cond_wait() и , никогда не просыпается, даже если я уверен (по журналам), вызываемый pthread_cond_broadcast().
Если я убью первый процесс и запустил еще один, он отлично работает. Другими словами, переменная условия pthread_cond_broadcast(), похоже, пробуждает только один процесс за раз. Если в одной и той же общей переменной состояния ожидает более одного процесса, только первый из них может нормально проснуться, а остальные просто игнорируют трансляцию.
Почему это поведение? Если я отправлю pthread_cond_broadcast(), каждый процесс должен просыпаться, а не один (и, тем не менее, не всегда один и тот же).
Влад, я нахожусь в Linux, нет такого атрибута (согласно manpages). – janesconference
@james, проверьте ваши файлы заголовков ('find/usr/include/-type f | xargs egrep '(PTHREAD_PROCESS_SHARED | pthread_condattr_setpshared | pthread_mutexattr_setpshared)''), все должно быть в '/ usr/include/pthread.h' , даже в Linux (это POSIX в конце концов, и у меня есть это в моем ящике CentOS 4.x.) – vladr
... в котором также возникает вопрос, в то время как мы на нем, на какой Linux вы? :) ('uname -a; cat/etc/issue') – vladr