【问题标题】:How to obtain an exclusive lock *first* and then downgrade to shared without releasing the lock如何*先*获得排他锁,然后在不释放锁的情况下降级为共享锁
【发布时间】:2013-11-15 07:57:30
【问题描述】:

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

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

【问题讨论】:

  • 我可能已经过时了这些酷孩子,但我认为通常的模式是尝试升级,如果失败,则完全释放锁定并重新开始。显然这有其缺点,但死锁不是其中之一:-)
  • 两个线程无法获得可升级锁。任何时候都只能持有一个可升级锁。这就是它可以升级的原因:它会阻塞升级,直到当前的共享锁被释放。
  • @Ben,这与 unique_lock 有何不同?
  • 不同之处在于您可以拥有可升级的锁而其他人拥有共享锁。你不能拥有唯一锁而其他人拥有共享锁。
  • 所以我可以直接使用已有的例子,获得升级锁后立即升级吗?

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


【解决方案1】:

Boost 通过UpgradeLockable 概念提供此功能。你要找的方法是unlock_and_lock_shared()

upgrade_mutex 类提供了此概念的实现。

【讨论】:

    【解决方案2】:

    似乎使用锁适配器的正确方法应该是这样的:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多