Я думаю, что вы что-то неправильно поняли - вполне законно вызывать pthread_cond_signal
, даже если ни одно из потоков не ожидает этого условия.
Кроме того, в контексте многопоточного программирования, вызывая что-то как операцию чтения
обычно подразумевает, что это не меняет состояние общего ресурса. Если под "читать"
Вы действительно имеете в виду «удалить элемент из головы очереди», который меняет состояние
очередь (другими словами, это также «запись».) Для вашей ситуации может быть лучше думать с точки зрения «потребителя и производителя», а не «читателя и писателя».
Для вашей ситуации должно быть достаточно одного мьютекса (чтобы гарантировать исключительный доступ к очереди) и двух условных переменных («данные доступны», «доступно свободное пространство»). (Если
очередь может расти динамически, вам не понадобится условная переменная «доступно свободное место»;
Я просто упоминаю это для полноты.)
Если ваши потоки чтения строго читателей (то есть они не изменяют структуру данных общей очереди каким-либо образом, например, вытаскивая элемент из очереди) Семейство вызовов pthread_rwlock
также может быть подходящим решением. В этой парадигме есть блокировки чтения (которые могут удерживать несколько читателей одновременно, но вынуждают писателей блокировать до тех пор, пока читатели не закончат работу) и блокировки записи (которые обеспечивают исключительный доступ для потока, удерживающего блокировку записи, блокируя любых других писателей и читатели).