这是一个小代码段
request_ptr pop()
{
request_ptr rp;
std::unique_lock<std::mutex> lock(cv_mtx);
auto time = std::chrono::milliseconds(10000);
if (!cv.wait_for(lock, time, [this] { return !this->is_empty(); }))
{
return rp;
}
std::lock_guard<std::mutex> mtx_guard(mtx);
rp.reset(new request(std::move(requests.front())));
requests.pop();
return rp;
}
通知wait_for
时cv
的行为如何?
是否返回true
而不检查is_empty
的返回值?
还是仅当true
返回is_empty
时返回true
?
答案 0 :(得分:1)
根据[thread.condition.condvar]/36通话...
cv.wait_for(lock, rel_time, pred);
等同于...
cv.wait_until(lock, chrono::steady_clock::now() + rel_time, std::move(pred));
in turn,相当于...
while (!pred())
if (wait_until(lock, abs_time) == cv_status::timeout)
return pred();
return true;
因此wait_for
返回的值应该是谓词返回的当前值。