У меня есть приложение C++ 11 с высокоприоритетным потоком, который производит данные, и поток с низким приоритетом, который его потребляет (в моем случае, записывая его на диск) , Я хотел бы удостовериться, что поток приоритетных производителей никогда не блокируется, т. Е. Он использует только блокирующие алгоритмы.C++ 11 неблокирующий производитель/потребитель
С заблокированной очередью я могу передавать данные в очередь из потока производителей и опросить ее из потребительского потока, тем самым выполняя мои цели выше. Я бы хотел изменить мою программу, чтобы потребительский поток блокировался, когда он неактивен, вместо опроса.
Кажется, что переменная условия C++ 11 может быть полезна для блокировки потребительского потока. Может ли кто-нибудь показать мне пример того, как его использовать, избегая при этом возможности, что потребитель спит с данными, находящимися в очереди? В частности, я хочу убедиться, что потребитель всегда пробуждается в течение некоторого конечного времени после того, как производитель нажимает последний элемент в очередь. Также важно, чтобы производитель оставался неблокирующим.
См. Пример использования переменной условия в http: //codereview.stackexchange.com/questions/39199/multi-producer-consumer-queue-without-boost-in-c11 – GabiMe
Это невозможно сделать без блокировки с переменной условия, потому что ждать или сигнализировать на одном вы должны были получить блокировку , На практике это не делает реальной разницы (большинство блокировок будет иметь короткую оживленную стратегию ожидания, которой должно быть достаточно, чтобы избежать любых вызовов ядра или иначе, так как критический раздел для читателя невероятно короткий) – Voo
@Voo Нет необходимости получить блокировку, чтобы сигнализировать переменную условия. – Casey