Когда можно использовать std :: condition_variable без предиката?

Если std::condition_variable может быть сигнализирован из-за ложных пробуждений (и мы не можем быть уверены, что необходимое условие действительно выполняется), почему стандартная библиотека C ++ обеспечивает перегрузки wait() метод без предиката? Каковы сценарии, когда такое поведение может быть использовано?

5

Решение

Предположим, сложное состояние: 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);
}

Обратите внимание, что в отличие от первого варианта, теперь каждая часть условия оценивается один раз.

Есть более сложные случаи, когда условие не может быть записано в одном выражении.

6

Другие решения

Я предполагаю, что есть случаи, когда ложные пробуждения не конец света.

Например, рассмотрим систему пакетной обработки производитель-потребитель, в которой какой-то поток должен проснуться, когда в очереди, скажем, по меньшей мере 100 сообщений, и обработать их.

При ложных пробуждениях иногда может быть получено менее 100 сообщений. Разница может не оправдывать накладные расходы и дополнительную сложность функции условия.

3

почему стандартная библиотека C ++ обеспечивает перегрузки метода wait () без предиката

Предикатная версия wait эквивалентно:

while (!pred()) {
wait(lock);
}

Если вам нужно выполнить более сложный код до и / или после ожидания, вы можете использовать wait без предиката.

3
По вопросам рекламы [email protected]