pthreads:读/写锁,升级读锁到写锁

Sca*_*ark 15 c++ locking pthreads

我在Linux上使用读/写锁,我发现尝试将读锁定对象升级为写锁死锁.

// acquire the read lock in thread 1.
pthread_rwlock_rdlock( &lock );

// make a decision to upgrade the lock in threads 1.
pthread_rwlock_wrlock( &lock ); // this deadlocks as already hold read lock.
Run Code Online (Sandbox Code Playgroud)

我已经阅读了手册页,它非常具体.

如果在进行调用时调用线程可能会死锁,它会保持读写锁定(无论是读还是写锁).

在这些情况下,将读锁升级到写锁的最佳方法是什么.我不想在我保护的变量上引入竞争.

据推测,我可以创建另一个互斥锁来包含释放读锁定和获取写锁定但是我并没有真正看到使用读/写锁定.我不妨简单地使用普通的互斥锁.

谢谢

APr*_*mer 17

在下面的场景中你还想要一个死锁吗?

  • 线程1获取读锁定
  • 线程2获取读锁定
  • 线程1要求升级锁写入
  • 线程2要求升级锁写入

所以我只是释放读锁定,获取写锁定并再次检查我是否要进行更新.

  • 在回答你的问题"你期望什么"时,答案是如果r/w锁是可升级的,那么类似于:线程1尝试升级块,然后线程2的尝试失败.线程2通过释放读卡器锁并尝试重新获取它并重新开始响应此响应.一旦它发布,线程1可以获得编写器锁,完成其事务,并放弃锁.任何人试图在Thread1等待写入器锁定时让读取器锁定,阻塞直到Thread1释放两者.乐观锁定,有点. (5认同)