В чем разница между std::condition variable::wait for и std::condition variable::wait until?
на ссылка я использую объясняет эти два следующим образом:
wait_for
"блокирует текущий поток до тех пор, пока переменная условия не будет разбужена или после указанной продолжительности тайм-аута"wait_until
"блокирует текущий поток до тех пор, пока переменная условия не будет разбужена или пока не будет достигнута заданная точка времени"
в чем разница? Уилл!--1--> вращать так, чтобы поток может продолжать точно (более или менее), когда он сигнализируется, тогда как wait_for
просто добавляет поток обратно в поставках в этот момент?
4 ответов
разница в том, как представлена продолжительность ожидания:wait_for
занимает относительное время ("подождите до 10 секунд"), тогда как wait_until
занимает абсолютное время ("подождите до 12:00 30 октября 2012 года").
сравните объявления временных параметров:
// wait_for:
const std::chrono::duration<Rep, Period>& rel_time
// wait_until:
const std::chrono::time_point<Clock, Duration>& abs_time
ваш вопрос и другие ответы все повторили разницу; что wait_for
ждет определенное количество времени и wait_until
ожидает до определенного момента времени,но последствия не прописаны.
A time_point
имеет связанные часы, и эти часы-это то, что используется для определения, наступило ли соответствующее время. Это означает, что корректировки часов принимаются во внимание
-
wait_for
будет ждать определенное количество времени. Например, он будет ждать две секунды. -
wait_until
будет ждать, пока не будет достигнуто некоторое время. Это, например, подождать до 23 июля 2013 11:22:34 ч. в сутки.
вот одно важное различие в их использовании, как объясняется в Энтони Уильямса книги:
рассмотрим этот пример, где переменная условия ждет с таймаутом:
std::condition_variable cv;
bool done;
std::mutex m;
bool wait_loop()
{
auto const timeout= std::chrono::steady_clock::now()+
std::chrono::milliseconds(500);
std::unique_lock<std::mutex> lk(m);
while(!done)
{
if(cv.wait_until(lk,timeout)==std::cv_status::timeout)
break;
}
return done;
}
это рекомендуемый способ ожидания переменных состояния с ограничение по времени, если вы не передаете предикат ожиданию. Именно такой образ, общая длина цикла bounded. Как вы видели в разделе 4.1.1, необходимо в цикле при использовании переменных условий, если вы не передаете предикат, для обработки ложных пробуждений. Если вы используете
wait_for()
в цикле вы можете в конечном итоге ждать почти всю длину о времени до ложного пробуждения, и в следующий раз через ожидание начинается снова. Это может повториться любое количество раз, делая общее время ожидания неограниченная.
ИМО, это один из таких сценариев, где wait_for
не могу заменить wait_until
так легко, из-за его сброс природы.