5

Stack Overflow 有几个例子,其中函数首先获得可升级锁,然后通过升级获得独占访问。我的理解是,这可以会导致死锁,因为两个线程可能都获得可升级/共享锁,然后都尝试升级,此时两个线程都无法继续,因为另一个线程具有共享锁。

我想要的是先获得独占锁,然后在不完全释放锁的情况下降级为共享锁。我找不到这样的例子。有任何想法吗?

4

2 回答 2

4

Boost 通过UpgradeLockable概念提供此功能。您正在寻找的方法是unlock_and_lock_shared().

这个概念的实现由upgrade_mutex类提供。

于 2013-11-04T16:48:14.953 回答
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_lockRV 引用定义的显式转换shared_lock,调用unlock_and_lock_shared( ). 请参阅此电子邮件线程来源

于 2016-08-31T21:39:37.580 回答