Вы спрашиваете,
. Каков наилучший способ ожидания нескольких переменных условий в C ++ 11?
blockquote>] Вы не можете и должны перепроектировать. Один поток может ожидать только одну переменную условия (и связанный с ней мьютекс) за раз. В этом отношении возможности Windows для синхронизации довольно богаче, чем у семейств примитивов синхронизации типа «POSIX».
Типичный подход с потоковыми безопасными очередями заключается в том, чтобы вставить специальное «все сделано!». сообщение или создать «прерывистую» (или «выключенную») очередь. В последнем случае внутренняя переменная условия очереди защищает сложный предикат: либо доступен предмет , либо , очередь была сломана.
В комментарии вы заметили, что
a notify_all () не будет иметь никакого эффекта, если никто не ждет
blockquote>Это правда, но, вероятно, не актуально.
wait()
включение переменной условия также подразумевает проверку предиката и проверку его перед фактическим блокированием для уведомления. Таким образом, рабочий поток, занятый обработкой элемента очереди, который «пропускает»notify_all()
, увидит, в следующий раз, когда он проверяет условие очереди, что предикат (новый элемент доступен или завершена очередь) изменился .