堆栈溢出有几个示例,其中一个函数首先获得可升级的锁(),然后通过升级获得独占访问。我的理解是,如果不小心使用,这可能会导致死锁,因为两个线程都可能获得可升级/共享锁,然后都尝试升级,此时由于另一个线程有共享锁,因此两者都不能继续。
我想要的是先获得独占锁,然后降级为共享锁,而不完全释放锁。我找不到这方面的例子。有什么想法吗?
发布于 2013-11-04 16:48:14
Boost通过UpgradeLockable概念提供了这个功能。您要寻找的方法是unlock_and_lock_shared()。
这个概念的实现由upgrade_mutex类提供。
发布于 2016-08-31 21:39:37
使用锁适配器进行此操作的正确方法应该如下所示:
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( )。参见这个电子邮件线程和来源。
https://stackoverflow.com/questions/19772126
复制相似问题