0 作为 std::condition_variable::wait_for 中的超时
0 as a timeout in 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;
}
}
有没有开销?
根据工作草案和C++11标准部分32.6.3(int the working draft),wait_for
是
Equivalent to: 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
函数的时间点) ,这将基本上立即超时(因此 return)。
因此它不同于
_cv.wait(lk, []() {
return someCondition;
}
它将阻塞直到 someCondition
为真。
例如我有下一个代码:
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;
}
}
有没有开销?
根据工作草案和C++11标准部分32.6.3(int the working draft),wait_for
是
Equivalent to:
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
函数的时间点) ,这将基本上立即超时(因此 return)。
因此它不同于
_cv.wait(lk, []() {
return someCondition;
}
它将阻塞直到 someCondition
为真。