我正在设计一个异步记录器类,如下所示。但是,不确定我是否以正确的方式使用升压条件变量。有人可以对此发表评论吗?这里的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();
}
正如已经指出的那样,您必须要么mStop
原子或守卫all它通过互斥体进行访问。把...忘了吧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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)