如何实现no hold并等待以防止死锁

时间:2017-03-28 20:46:07

标签: c++ deadlock

我已经编写了一个故意死锁的代码,它有2个锁,而我解锁该程序的方式是这样的:

void ThreadAtWork1(){
  m1.lock();
  cout<<"Thread 1 has been called\n";
  m2.lock();
  m1.unlock();
  m2.unlock();
}

void ThreatAtWork2(){
  m2.lock();
  cout<<"Thread 2 has been called\n";
  m1.lock();
  m2.unlock();
  m1.unlock();

}

如何实施“不”等待&#39;解决方案阻止程序死锁?我知道我可以重新订购锁,但这不会解决无保留和等待解决方案。

我的主要职能:

int main(int argc, const char * argv[]) {

thread t1(ThreadAtWork1);
thread t2(ThreatAtWork2);

t1.join();
t2.join();

cout<<"\nMain exited...\n";

return 0;
}

感谢。

2 个答案:

答案 0 :(得分:0)

我怀疑“没有等待”是一个一般原则,你试图避免在互斥锁被锁定时进行阻塞调用。除非你非常小心,否则这样做很容易造成死锁。

如果您必须同时锁定两个互斥锁,则“无保留并等待”不适合您。

通常,您可以重新设计系统,而不是要求同时锁定两个互斥锁。例如,将多个条件变量与同一个互斥锁相关联是完全可以的。

答案 1 :(得分:0)

前段时间我确实搞清楚了,但忘了更新这篇文章。下面是我如何去做它并获得100。

> gc .\export.csv
"Header1","Header2","Header3"
"9","3","17"