使用来自boost的timed_wait?

时间:2012-03-27 07:44:19

标签: c++ boost boost-thread

我正在尝试使用来自boost的timed_wait。现在我实际上不太确定如何做到这一点。

整个事情的目的是确定它的状态。在下面的代码中,调用函数getStatus()。这个函数是异步的,如果一切正常,它会调用一个特定的回调函数来指示一切都是正确的。如果它没有及时调用回调(因此发生超时),我知道出了问题。

所以这是示例代码:

void myClass::checkStatus()
{
    boost::mutex::scoped_lock lock(m_Mutex);
    boost::condition_variable cond;
    while(true)
    {
        getStatus();  // Async Call to get the actual status
        if(!cond.timed_wait(lock,boost::posix_time::milliseconds(3000),/* Callback */))
        { 
           // Timeout
        }
        else
        {
            // OK 
        }
    }
}
bool myClass::myCallback()
{
/* ... */
}

所以,正如你所看到的,我不知道如何将回调恰当地“添加”到我的timed_wait。实际上我实际上并不知道它是如何工作的,因为我希望从我的异步线程而不是timed_wait本身调用我的回调? (异步线程需要表明一切顺利)

我也调查了Boost Documentation,但它对我帮助不大。

关于第二个问题:这个示例中的互斥锁是否总是被锁定..?

1 个答案:

答案 0 :(得分:3)

关于您的第二个问题:在执行checkStatus期间,互斥锁被锁定在整个timed_wait函数除外)中。这是关键。

我不确定你对myCallback的意图是什么。但要检查状态,我会将状态成员添加到myClass,在getStatus中进行设置,然后在else的{​​{1}}分支中进行检查。一个例子:

timed_wait

我希望现在更清楚了。也许你可以在这种方法中集成你的回调函数。此外,您应该考虑在超时的情况下取消后台线程以避免竞争条件。

编辑:请注意,条件变量必须是成员才能通知它有关异步操作的结束。