繁体   English   中英

死锁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() ,发生了太多事情,因此编译器无法确定我们endWorkprintf()内部更改endWork变量。 因此,它不会如上所述优化循环。

该如何处理? 最简单的方法是将endWork声明为volatile。 这将为编译提供提示,值endWork可能会在其他地方更改(即,由另一个线程更改),因此它不会优化如上所示的循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM