【发布时间】:2011-01-25 08:09:14
【问题描述】:
我在 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.
我已经阅读了手册页,它非常具体。
如果在 通话时间 读写锁(无论是读还是 写锁)。
在这种情况下,将读锁升级为写锁的最佳方法是什么。我不想在我保护的变量上引入竞争。
大概我可以创建另一个互斥锁来包含读锁的释放和写锁的获取,但是我并没有真正看到读/写锁的使用。我还不如简单地使用一个普通的互斥锁。
谢谢
【问题讨论】:
-
Boost.Thread 具有 UpgradeLockable 概念,但如果您的代码已经深入 pthreads,我怀疑这对您有多大用处。
-
@Steve。你知道它是如何实现的吗?它是否使用我正在考虑做的单独的互斥锁。我想我可以下载它并检查一下:o)
-
不,我不知道 Boost.Thread 是怎么做到的,抱歉。
-
@ScaryAardvark(以及其他想要总结 Boost 实现的人):我刚刚查看了 pthread 实现的 1.47.0 版本的代码,它使用互斥锁和 3 个条件变量而不是pthread_rwlock_t。查看 boost/thread/pthread/shared_mutex.hpp 了解详情。