3

我正在设计一个异步记录器类,如下所示。但是,不确定我是否以正确的方式使用了 boost 条件变量。任何人都可以对此发表评论吗?这里的 processLogEntry 方法是一个线程函数,我在这里使用 boost。

void LogWriter::stopThread()
{
    mStop = true;
    mCond.notify_one();
    mThread->join();
}   

void LogWriter::processLogEntry()
{
    while(!mStop)
    {
        boost::mutex::scoped_lock lock(mMutex);
        mCond.wait(lock);
        while(!q.empty())
        {
            // process begins
        }
    }
}

void LogWriter::addLogEntry()
{
    boost::mutex::scoped_lock lock(mMutex);
    // add it in the queue
    mCond.notify_one();
}
4

1 回答 1

3

正如已经指出的那样,您必须使用互斥锁进行mStop原子访问或保护其所有访问。算了volatile,这与你的目的无关。

此外,当等待条件变量时,wait即使没有调用通知函数(这些是所谓的虚假唤醒),调用也可能返回。因此,wait需要保护调用。

void LogWriter::stopThread()
{
    {
        boost::mutex::scoped_lock lock(mMutex);
        mStop = true;
        mCond.notify_one();
    }
    mThread->join();

}   

void LogWriter::processLogEntry()
{
    for(;;) {
        boost::mutex::scoped_lock lock(mMutex);
        // We wait as long as we're not told to stop and
        // we don't have items to process
        while(!mStop && q.empty()) mCond.wait(lock);

        // Invariant: if we get here then
        // mStop || !q.empty() holds

        while(!q.empty())
        {
            // process begins
        }

        if(mStop) return;
    }
}
于 2012-09-10T06:32:33.427 回答