![](/img/trans.png)
[英]Do I have a risk to put a thread in deadlock with std::condition_variable in C++?
[英]deadlock c++ thread condition variable
我的班级工人有问题。
Workers::Workers(int _nbThreads):
goWork(false),
progressWork(false),
endWork(false),
endFinishedWork(false),
nbThreads(_nbThreads)
{
for(int i=0;i<nbThreads;i++){
threads.push_back(new std::thread(&Workers::threadsExecute,this,i));
}
}
void Workers::threadsExecute(int numThread){
for(;;){
std::unique_lock<std::mutex> uniqueMutexWork(mutexWork);
conditionWorkStarted.wait(uniqueMutexWork, [this] {return goWork==true;});
progressWork=true;
mutexWork.unlock();
conditionWorkProgress.notify_all();
for(;!endWork;);
mutexWork.lock();
endFinishedWork=true;
mutexWork.unlock();
conditionWorkFinished.notify_all();
break;
}
}
void Workers::threadsEnd(){
for(int i=0;i<nbThreads;i++){
threads[i]->join();
}
}
void Workers::startWork(int numThread){
std::unique_lock<std::mutex> uniqueMutexWork(mutexWork);
goWork=true;
conditionWorkStarted.notify_all();
conditionWorkProgress.wait(uniqueMutexWork, [this] {return progressWork==true;});
}
void Workers::stopWork(int numThread){
std::unique_lock<std::mutex> uniqueMutexWork(mutexWork);
endWork=true;
conditionWorkFinished.wait(uniqueMutexWork, [this] {return endFinishedWork==true;});
}
主要的 :
Workers workers* = new Workers(1);//Only one thread worker
workers->startWork(0);
workers->stopWork(0);
问题在于,变量endWork在以下位置永远找不到
for(;!endWork;);
但是,在stopWork方法中可以很好地实现这一点:
endWork=true;
如果我更换
for(;!endWork;);
通过
for(;!endWork;){printf("work\n");}
该程序运行良好! 我的错误是什么?
我期待着您的回复。
for(;!endWork;){printf("work\\n");}
该程序运行良好! 我的错误是什么?
由于变量endWork
是一个常规变量,因此具有高优化选项(即-O3
)的编译器可能会假定该变量没有更改,并优化了循环内的读取,即它对循环进行了转换:
for( ; !endWork; ) ;
至
if(!endWork) for (;;) ;
使用printf()
,发生了太多事情,因此编译器无法确定我们endWork
在printf()
内部更改endWork
变量。 因此,它不会如上所述优化循环。
该如何处理? 最简单的方法是将endWork
声明为volatile。 这将为编译提供提示,值endWork
可能会在其他地方更改(即,由另一个线程更改),因此它不会优化如上所示的循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.