尝试使用:
bool
wait_until(
unique_lock<mutex>& lock,
const chrono::time_point<Clock, Duration>& t,
Predicate pred);
boost::condition_variable::wait_until
的形式(长篇故事为何不std
)。文档说明了这些的影响是&#34; As-if:&#34;
while(!pred())
{
if(!wait_until(lock,abs_time))
{
return pred();
}
}
return true;
但wait_until(lock,abs_time)
形式的wait_until
实际上会返回cv_status
类型,定义为:
enum class cv_status;
{
no_timeout,
timeout
};
由于cv_status
类型无法隐式转换为bool
(对吗?),if(!wait_until(lock,abs_time))
条件来自&#34; As-if&# 34;究竟是什么意思?我想它会说&#34;如果等待超时,则返回谓词的值&#34;但是我不能从if
语句和cv_status
的{{1}}返回类型的形式获得该信息。
现在,wait_until
文档&#34;相当于&#34;似乎正是我所期待的:
std
因此可以安全地假设while (!pred()) {
if (wait_until(lock, abs_time) == std::cv_status::timeout) {
return pred();
}
}
return true;
文档稍微偏离,并且boost
文档中的实现是如此?
答案 0 :(得分:1)
你可能会混淆文档¹。
在此示例代码中: Live On Coliru (输出:“Nay”)
#include <boost/thread.hpp>
#include <iostream>
int main()
{
boost::mutex m;
boost::condition_variable cv;
boost::unique_lock<boost::mutex> lk(m);
if (cv.wait_until(lk,
boost::chrono::high_resolution_clock::now() + boost::chrono::seconds(1),
[] { return false; }))
{
std::cout << "Yay\n";
} else {
std::cout << "Nay\n";
}
}
wait_until
的返回类型实际上是bool。该调用的实现实际上是:
template <class Clock, class Duration, class Predicate>
bool
wait_until(
unique_lock<mutex>& lock,
const chrono::time_point<Clock, Duration>& t,
Predicate pred)
{
while (!pred())
{
if (wait_until(lock, t) == cv_status::timeout)
return pred();
}
return true;
}
如您所见,它明确处理cv_status
类型。
除此之外,它看起来好像[原文如此]“As-if”代码是伪代码,它假设有一种bool类型的返回值。我同意这在技术上是“不正确的”。