Я пишу приложение, чувствительное к задержкам, которое фактически хочет ждать сразу нескольких переменных условий. Я читал ранее несколько способов получить эту функциональность в Linux (по-видимому, это встроено в Windows), но ни один из них не подходит для моего приложения. Методы, о которых я знаю, следующие:
-
Подождите один поток на каждой переменной состояния, которую вы хотите подождать, которая, когда woken будет сигнализировать одну переменную условия, которую вы ждете, вместо этого.
-
Переключение между несколькими переменными условия с ожидаемым временем ожидания.
-
Вместо этого создайте фиктивные байты для файлов или труб и опросите их.
# 1 и # 2 не подходят, потому что они вызывают ненужный спать. С# 1 вам нужно дождаться, когда поток фиктивного типа проснется, а затем сообщит реальный поток, а затем, чтобы реальный поток проснулся, вместо реального потока, который просто просыпался для начала - дополнительный квант планировщика, потраченный на это действительно важно для моего приложения, и я бы предпочел не использовать полноценную RTOS. # 2 еще хуже, вы потенциально тратите время ожидания N *, или ваш таймаут будет 0, и в этом случае вы никогда не будете спать (бесконечно горящий процессор и голодные другие потоки также плохие).
Для №3 трубы являются проблематичными, потому что если поток "сигнализирован" занят или даже падает (я на самом деле разбираюсь с отдельным процессом, а не с потоками), мьютексы и условия будут храниться в общей памяти) то записывающий поток будет застревать, потому что буфер буфера будет заполнен, как и любые другие клиенты. Файлы проблематичны, потому что вы будете бесконечно расти, чем дольше работает приложение.
Есть ли лучший способ сделать это? Любопытно, что ответы также подходят для Solaris.