如何*首先*获得独占锁,然后在不释放锁的情况下降级为共享锁



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 。请参阅此电子邮件线程和来源。

最新更新