Например, в Windows есть MsgWaitForMultipleObjects, который позволяет асинхронно ожидать сообщений Windows, событий сокета, асинхронного ввода-вывода (IOCompletionRoutine) и дескрипторов мьютекса.
В Unix у вас есть выбор / опрос, который дает вам все, кроме возможности взломать, когда разблокирован какой-то pthread_mutex.
История:
У меня есть приложение, которое имеет основной поток, который делает что-то с несколькими сокетами, каналами или файлами. Теперь время от времени появляется побочное задание (транзакция БД), которое может занимать больше времени, и, если оно выполняется синхронно в основном потоке, нарушает нормальное обслуживание сокетов. Поэтому я хочу сделать операцию DB в отдельном потоке. Этот поток будет ждать некоторого мьютекса во время простоя, пока основной поток не решит дать ему какую-то работу и разблокирует мьютекс, чтобы поток дБ мог его захватить.
Проблема в том, как поток базы данных может уведомить главный поток о том, что он завершил работу. Основной поток должен обрабатывать сокеты, поэтому он не может позволить себе спать в pthread_mutex_lock. Периодическое выполнение pthread_mutex_trylock - последнее, что я хотел бы сделать. В настоящее время я рассматриваю возможность использования трубы, но лучше ли это?