0作为std :: condition_variable :: wait_for中的超时

时间:2019-10-23 06:26:13

标签: c++ multithreading condition-variable stdthread

例如,我有下一个代码:

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 个答案:

答案 0 :(得分:2)

根据工作草案和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;}

并根据timing specifications,当chrono::steady_clock::now()> C_t(传递给wait_until函数的时间点C_t)时,该函数超时,该超时基本上将超时(并因此返回)立即。

因此与

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

它将一直阻塞,直到someCondition为真。