В чем разница между 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 так легко, из-за его сброс природы.