0 как тайм-аут в std::condition_variable::wait_for

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

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;
        }
}

Есть ли накладные расходы?


person Igor    schedule 23.10.2019    source источник
comment
Не заглядывал в стандарт, но cppreference не упоминает любое конкретное поведение. Поэтому нам нужно предположить, что тайм-аут истекает немедленно. Затем для wait_for требуется аргумент продолжительности, поэтому я предполагаю, что вы имели в виду wait во втором примере. В этом предположении оба примера ведут себя совершенно по-разному, wait возможно, ожидая вечности...   -  person Aconcagua    schedule 23.10.2019
comment
@Aconcagua Вы совершенно правы. Спасибо.   -  person Igor    schedule 23.10.2019


Ответы (1)


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

person Mike van Dyke    schedule 23.10.2019