Если std::condition_variable
может быть сигнализирован из-за ложных пробуждений (и мы не можем быть уверены, что необходимое условие действительно выполняется), почему стандартная библиотека C ++ обеспечивает перегрузки wait()
метод без предиката? Каковы сценарии, когда такое поведение может быть использовано?
Предположим, сложное состояние: A || B
, Когда некоторая часть условия верна, соответствующие действия, actionA
или же actionB
, должно быть выполнено.
Используя предикатную версию, код можно отслеживать (predAB()
оценивает состояние):
cond.wait(lock, predAB);
if(A) {
actionA();
}
else {
actionB();
}
Но код может быть Быстрее с ожиданием без предикатов:
while(true)
{
if(A) {
actionA();
break;
}
else if(B) {
actionB();
break;
}
cond.wait(lock);
}
Обратите внимание, что в отличие от первого варианта, теперь каждая часть условия оценивается один раз.
Есть более сложные случаи, когда условие не может быть записано в одном выражении.
Я предполагаю, что есть случаи, когда ложные пробуждения не конец света.
Например, рассмотрим систему пакетной обработки производитель-потребитель, в которой какой-то поток должен проснуться, когда в очереди, скажем, по меньшей мере 100 сообщений, и обработать их.
При ложных пробуждениях иногда может быть получено менее 100 сообщений. Разница может не оправдывать накладные расходы и дополнительную сложность функции условия.
почему стандартная библиотека C ++ обеспечивает перегрузки метода wait () без предиката
Предикатная версия wait
эквивалентно:
while (!pred()) {
wait(lock);
}
Если вам нужно выполнить более сложный код до и / или после ожидания, вы можете использовать wait
без предиката.