Stack Overflow有几个examples,其中一个函数获得可升级锁第一个,然后通过升级获得独占访问权。我的理解是,如果没有小心使用,可以导致死锁,因为两个线程都可以获得可升级/共享锁,然后两者都尝试升级,此时两者都无法继续,因为另一个拥有共享锁
我想要的是首先获得排他锁,然后降级到共享锁而不完全释放锁。我找不到这样的例子。有什么想法吗?
答案 0 :(得分:4)
Boost通过UpgradeLockable概念提供此功能。您要查找的方法是unlock_and_lock_shared()
。
upgrade_mutex
类提供了这个概念的实现。
答案 1 :(得分:0)
使用锁适配器执行此操作似乎应该是这样的:
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( )
。请参阅this e-mail thread和the source。