例如,我有下一个代码:
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;
}
}
有开销吗?
答案 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
为真。