bool版本的boost :: condition_variable :: wait_until如何使用谓词?

时间:2017-12-16 21:46:00

标签: c++ c++11 boost condition-variable

尝试使用:

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文档中的实现是如此?

1 个答案:

答案 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类型的返回值。我同意这在技术上是“不正确的”。

¹见enter image description here