如何获取排他锁* *然后降级到共享而不释放锁

时间:2013-11-04 16:20:34

标签: c++ boost-thread boost-mutex

Stack Overflow有几个examples,其中一个函数获得可升级第一个然后通过升级获得独占访问权。我的理解是,如果没有小心使用,可以导致死锁,因为两个线程都可以获得可升级/共享锁,然后两者都尝试升级,此时两者都无法继续,因为另一个拥有共享锁

我想要的是首先获得排他锁,然后降级到共享锁而不完全释放锁。我找不到这样的例子。有什么想法吗?

2 个答案:

答案 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 threadthe source