В документации для std :: condition_variable есть перегрузка wait(), принимающая в качестве аргумента функцию предиката. Функция будет ждать до первого wake_up, при котором функция предиката будет true.std :: condition_variable :: wait with predicate
Он заявил, что это эквивалентно:
while (!pred()) {
wait(lock);
}
Но также:
Эта перегрузка может быть использована, чтобы игнорировать паразитные пробуждений во время ожидания для конкретного условие, чтобы оно стало истинным. Обратите внимание, что перед входом в этот метод блокировка должна быть получена, после того, как выйдет (блокировка), она также будет восстановлена, т. Е. Блокировка может использоваться как защита для доступа pred().
Я не уверен, чтобы понять, являются эти strictrly эквивалент (в этом случае я предпочитаю равнину в то время как цикл, который легче читать, чем перегрузка с лямбда в моем случае), либо перегрузка (возможно, реализация зависит) более эффективны?
Может ли реализация оценить предикат в уведомляющем потоке до пробуждения ожидающего потока, чтобы избежать пробуждения, когда условие теста ложно? C++ нить гуру нужен здесь ...
Благодаря
Это было мое понимание цели этой функции. Но из документации я понял, что перегрузка может избежать пробуждения потока в случаях, когда переменная не изменилась. Это означало бы, что объект Predicate оценивается в другом потоке (например, уведомляющий поток), прежде чем эффективно пробуждать ожидающий поток. Таким образом, более эффективно – galinette
@ galinette Нет, не может. Он основан на условных переменных pthread, и у них есть ложные пробуждения. – SergeyA
Стандарт не основан на pthreads, ни на всех реализациях. И потоки окон имеют больше возможностей, чем pthreads в этом отношении, если я прав (поскольку я использую mingw-gcc у меня есть выбор) – galinette