我正在尝试使用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,但对我无济于事。

关于第二个问题:在此示例中,我的互斥锁是否始终处于锁定状态?

最佳答案

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

我不确定myCallback的意图是什么。但是要检查状态,我将一个状态成员添加到myClass中,将其设置为getStatus,然后在elsetimed_wait分支中进行检查。一个例子:

boost::condition_variable m_cond;

void myClass::checkStatus()
{
    boost::mutex::scoped_lock lock(m_Mutex);

    while(true)
    {
        getStatus();  // Async Call to get the actual status
        if(!m_cond.timed_wait(lock,boost::posix_time::milliseconds(3000),/* Callback */))
        {
           // Timeout
        }
        else
        {
            //check status
            if (m_status == STATUS_1)
            {
                // handle STATUS_1
            }
            else if (m_status == STATUS_2)
            {
                // handle STATUS_2
            }
         }
    }
}

void getStatus()
{
    boost::thread myThread(myWorkerFunc);
}

void myWorkerFunc()
{
    // do a long running operation to get the status
    int status = retrieveStatusSomehow();

    // lock the same mutex that you used for the condition variable
    boost::mutex::scoped_lock lock(m_Mutex);

    // assign the status to member
    m_status = status;

    // notify the condition to wake up
    m_cond.notify_all();
}

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

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

关于c++ - 使用来自boost的timed_wait吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9885305/

10-09 13:24