【问题标题】:0 as a timeout in std::condition_variable::wait_for0 作为 std::condition_variable::wait_for 中的超时
【发布时间】:2020-02-19 08:03:24
【问题描述】:

例如我有下一个代码:

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

有开销吗?

【问题讨论】:

  • 尚未深入了解标准,但cppreference 并未提及任何具体行为。所以我们需要假设超时立即过去。然后wait_for 需要一个持续时间参数,所以我假设您打算在第二个示例中使用wait。在这种假设下,两个示例的行为完全不同,wait 可能永远等待......
  • @Aconcagua 你完全正确。谢谢。

标签: c++ multithreading condition-variable stdthread


【解决方案1】:

根据工作草案和C++11标准部分32.6.3(int the working draft),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(C_t传递给wait_until函数的时间点)时超时,基本上会立即超时(并因此返回)。

所以它不同于

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

someCondition 为真之前会一直阻塞。

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 2019-01-22
    • 1970-01-01
    • 2015-02-27
    • 2016-03-11
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多