Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::shared_timed_互斥体上的共享锁能否升级为独占锁?_C++_Multithreading_C++11_C++14 - Fatal编程技术网

C++ std::shared_timed_互斥体上的共享锁能否升级为独占锁?

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_互斥锁允许两种类型的锁:shared和exclusive

如果一个人持有一个共享锁,有没有办法将它原子化地交换(“升级”)为独占锁?换句话说,给定以下代码,我如何避免非原子丢弃和重新锁定

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不能,但是