【发布时间】:2014-08-11 15:52:14
【问题描述】:
我有以下代码:
主线程通知工作线程开始/停止一些工作。在主线程中,触发器是一些 UI 按钮(本例中为 Qt SDK):
void PlaySlot(bool checked){
boost::unique_lock<boost::mutex> lock(m_mutex);
if(checked == true){
m_isPlayMode = true;
m_event.notify_one(); //tell thread to start playing.
}else{
m_isPlayMode = false;
}
}
现在,在工作线程中,一旦 m_isPlayMode 为真,一些循环开始运行一段有限的时间,并在时间结束或 m_isPlayMode 时退出变成假的。
线程操作符内部:
while(true)
{
boost::unique_lock<boost::mutex> lock(m_mutex);
m_event.wait(lock); //wait for next event
if(m_isPlayMode == true){
while(m_frameIndex< totalFrames && m_isPlayMode){
m_frameIndex++;
///do some work
}
m_isPlayMode = false;
emit playEnded(false);
}
}
现在,在循环开始播放后发生了什么,当 PlaySlot() 被 'checked' = false 触发时,它不会更新 m_isPlayMode 并且程序变得无响应。我怀疑这是条件竞争问题,因为我正在尝试锁定已经锁定在线程循环中的互斥锁。
我通过从 PlaySlot 方法中删除 unique_lock 并将 m_isPlayMode 转换为原子变量来解决它。它有效。
但我想知道两件事:
这样的解决方案有什么危险吗?
可以用其他方法解决吗?
【问题讨论】:
标签: c++ multithreading boost