同时锁定两个互斥锁

Zis*_*Zis 1 c++ multithreading mutex

我正在尝试实现一个多入多出的线程间通道类。我有三个互斥锁:full缓冲区已满时锁定。empty当缓冲区为空时锁定。th当其他人正在修改缓冲区时锁定。我的单个 IO 程序看起来像

operator<<(...){
  full.lock()        // locks when trying to push to full buffer
  full.unlock()      // either it's locked or not, unlock it
  th.lock()
  ...
  empty.unlock()     // it won't be empty
  if(...)full.lock() // it might be full
  th.unlock()
operator>>(...){
  // symmetric
}
Run Code Online (Sandbox Code Playgroud)

这对于单个 IO 完全适用。但是对于多个 IO,当消费者线程解锁时full,所有提供者线程都会关闭,只有一个会获取th并且缓冲区可能会因为单个线程而再次变满,而不再进行完整检查。我full.lock()当然可以再次添加,但这是无止境的。反正是有锁full,并th在同一时间?我确实看到了一个类似的问题,但我没有看到这里的问题是订单。

Ram*_*ama 5

是的,使用std::lock(full , th);,这可以避免一些死锁

例如:线程1:

full.lock();
th.lock();
Run Code Online (Sandbox Code Playgroud)

线程2:

th.lock();
full.lock();
Run Code Online (Sandbox Code Playgroud)

这可能会导致死锁,但以下不会:

线程1:

std::lock(full, th);
Run Code Online (Sandbox Code Playgroud)

线程2:

std::lock(th, full);
Run Code Online (Sandbox Code Playgroud)

  • 您所描述的内容与此答案的上下文无关。两个线程都锁定两个互斥体,并且两个线程都以无死锁的方式这样做。你能解释一下在这些条件下如何发生这样的问题吗? (2认同)