0 как время ожидания в std :: condition_variable :: wait_for - PullRequest
2 голосов
/ 23 октября 2019

Например, у меня есть следующий код:

void waitForResponse(const std::optional<int64_t>& ms){
    std::unique_lock lk{_mtx};
    _cv.wait_for(lk, std::chrono::milliseconds{ms ? *ms : 0}, []() {
            return someCondition;
        }
}

Это указано в стандарте, если я передам 0 в качестве аргумента длительности? Он равен следующему коду?:

void waitForResponse(const std::optional<int64_t>& ms){
    std::unique_lock lk{_mtx};
    _cv.wait_for(lk, []() {
            return someCondition;
        }
}

Есть ли издержки?

1 Ответ

2 голосов
/ 23 октября 2019

Согласно рабочему проекту и стандартному разделу C ++ 11 32.6.3 (в рабочем проекте), wait_for равно

Эквивалентно: return wait_until(lock, chrono::steady_clock::now() + rel_time, std::move(pred));

Поэтому, когда вы проезжаете

_cv.wait_for(lk, std::chrono::milliseconds{0}, []() return someCondition;}

, вы в основном звоните

_cv.wait_until(lk, chrono::steady_clock::now(), []() return someCondition;}

и, соответственно,согласно временным характеристикам , функция отключается, когда chrono::steady_clock::now()> C_t (C_t точка времени, переданная функции wait_until), что приведет к таймауту (и, следовательно, возврату) в основном немедленно.

И поэтому он отличается от

_cv.wait(lk, []() {
    return someCondition;
}

, который будет блокироваться, пока someCondition не станет истинным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...