C++ std::shared_timed_互斥体上的共享锁能否升级为独占锁?
新的std::shared_timed_互斥锁允许两种类型的锁:shared和exclusive 如果一个人持有一个共享锁,有没有办法将它原子化地交换(“升级”)为独占锁?换句话说,给定以下代码,我如何避免非原子丢弃和重新锁定C++ std::shared_timed_互斥体上的共享锁能否升级为独占锁?,c++,multithreading,c++11,c++14,C++,Multithreading,C++11,C++14,新的std::shared_timed_互斥锁允许两种类型的锁:shared和exclusive 如果一个人持有一个共享锁,有没有办法将它原子化地交换(“升级”)为独占锁?换句话说,给定以下代码,我如何避免非原子丢弃和重新锁定 std::shared_timed_mutex m; //Guards a std::vector. m.lock_shared(); //Read from vector. (Shared lock is sufficient.) // ... //Now we w
std::shared_timed_mutex m; //Guards a std::vector.
m.lock_shared();
//Read from vector. (Shared lock is sufficient.)
// ...
//Now we want to write to the vector. We need an exclusive lock.
m.unlock_shared();
// <---- Problem here: non-atomic!
m.lock();
//Write to vector.
// ...
m.unlock();
std::共享\u定时\u互斥锁m//保护一个std::向量。
m、 lock_shared();
//从向量读取。(共享锁就足够了。)
// ...
//现在我们要写向量。我们需要一个专用锁。
m、 解锁_共享();
//不,它不能。该功能是以upgrade\u mutex
和upgrade\u lock
的名义向委员会提出的,但委员会选择拒绝该部分提议。目前还没有重新部署该功能的工作
编辑
为了回答user3761401问题中的“从这里去哪里”编辑,我在这里创建了一个部分受损的升级互斥体/升级锁的实现:
请随意使用这个。它属于公共领域。它只经过少量测试,没有中所述的全部功能。具体而言,缺少以下功能:
- 无法将
唯一锁定
转换为共享定时锁定
- 无法尝试或定时将
共享\u定时\u锁
转换为唯一\u锁
- 无法尝试或定时将
升级锁
转换为唯一锁
话虽如此,我已经在upgrade\u mutex
中包含了这个功能,它可以以一种非常丑陋的方式在如此低的级别上访问(这样的示例在main.cpp中)
中提到的其他锁转换可用
- 尝试从
shared\u timed\u lock
到upgrade\u lock
的定时转换
- 从
升级锁
转换为共享锁
- 阻止从
升级锁
到唯一锁
的转换
- 从
唯一锁定
转换为升级锁定
它都被放在名称空间acme
中。把它放在你想要的任何名称空间中
要求
编译器需要支持“rvalue this”限定符和显式转换运算符
免责声明
代码只经过了少量测试。如果您发现bug,我将非常感谢您的请求
通过使用std::atomic
可以优化升级互斥锁。在这方面还没有做任何努力(这是一项困难且容易出错的任务,比我目前花费的时间要多)。感谢您的洞察力。我看到了,特别是“升级锁定概述”的开头部分,它正好解决了我的问题。你知道拒绝的理由吗?不幸的是我错过了那次会议。所以我不知道细节。在2007年的时间框架内,它也被提议用于C++11,但当时被拒绝了,因为我们需要消除材料,以便我们能够按时装运C++09(这并没有发生)。@BillyONeal:如果这是理由,那就是天真的错误<代码>升级\u互斥体
100%独立于共享\u互斥体
。除了升级互斥锁外,VS还可以有一个共享互斥锁
,由SRWLOCK
支持。这是为c++17重新提出的吗?在我看来,这是c++的线程支持库中的一个明显漏洞,而且似乎很容易插入。@RichardHodges:不,不是。委员会中没有人表示有兴趣拥有它。现在为C++17提出新的特性已经太晚了,但是总有下一个标准(C++2x)。如果你想提出,我可以帮助物流如何做到这一点。如果你能亲自提交提案,提案会最成功。似乎std::shared_mutex不能,但是