gpt4 book ai didi

c++ - 死锁C++线程条件变量

转载 作者:太空宇宙 更新时间:2023-11-04 12:51:49 27 4
gpt4 key购买 nike

我有一个名为 Workers 的类的问题。

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 方法中很好地设置为 true :

endWork=true;

如果我更换

  for(;!endWork;); 

for(;!endWork;){printf("work\n");}

程序运行良好!我的错误是什么?

期待您的回复。

最佳答案

for(;!endWork;){printf("work\n");} The program works well ! What is my error ?

由于变量endWork是一个常规变量,具有高优化选项的编译器(即 -O3 )可能会假设该变量不会更改并优化循环内的读取,即它转换循环:

for( ; !endWork; ) ;

if(!endWork) for (;;) ;

printf()发生的事情太多了,所以编译器无法确定我们是否更改了 endWork printf() 内的变量.因此,它不会如上所示优化循环。

如何处理这个问题?最简单的是声明 endWork作为 volatile 的。这会给编译一个提示,值 endWork可能会在别处更改(即由另一个线程),因此它不会像上面显示的那样优化循环。

关于c++ - 死锁C++线程条件变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48729875/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com