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 引用到调用unlock_and_lock_shared( )
的 shared_lock
。请参阅此电子邮件线程和来源。