Stack Overflow 有几个例子,其中函数首先获得可升级锁,然后通过升级获得独占访问。我的理解是,这可以会导致死锁,因为两个线程可能都获得可升级/共享锁,然后都尝试升级,此时两个线程都无法继续,因为另一个线程具有共享锁。
我想要的是先获得独占锁,然后在不完全释放锁的情况下降级为共享锁。我找不到这样的例子。有任何想法吗?
Stack Overflow 有几个例子,其中函数首先获得可升级锁,然后通过升级获得独占访问。我的理解是,这可以会导致死锁,因为两个线程可能都获得可升级/共享锁,然后都尝试升级,此时两个线程都无法继续,因为另一个线程具有共享锁。
我想要的是先获得独占锁,然后在不完全释放锁的情况下降级为共享锁。我找不到这样的例子。有任何想法吗?
Boost 通过UpgradeLockable概念提供此功能。您正在寻找的方法是unlock_and_lock_shared()
.
这个概念的实现由upgrade_mutex
类提供。
似乎使用锁定适配器执行此操作的正确方法应该是这样的:
boost::shared_mutex mtx;
void exclusive_to_shared( )
{
boost::unique_lock< boost::shared_mutex > unique_lock( mtx );
// The lock here is exclusive.
boost::shared_lock< boost::shared_mutex > shared_lock( std::move( unique_lock ) );
// The lock here is shared.
}
有一个从unique_lock
RV 引用定义的显式转换shared_lock
,调用unlock_and_lock_shared( )
. 请参阅此电子邮件线程和来源。