Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++ C++;11相当于增强共享互斥_C++_Boost_C++11_Mutex - Fatal编程技术网

C++ C++;11相当于增强共享互斥

C++ C++;11相当于增强共享互斥,c++,boost,c++11,mutex,C++,Boost,C++11,Mutex,对于boost::shared_mutex,是否有C++11等价物。或者另一种解决方案来处理C++11中的多读/单写器情况?简单。。。没有。没有标准的C++实现锁。 但是,你有几个选择 您只能使用自己的设备来锁定自己的读写器 使用特定于平台的实现,如或您提到的 一点也不要使用——使用C++11中已经存在的 使用#1并实现您自己的是一项可怕的任务,如果您没有正确理解,您可能会用竞争条件来迷惑代码。有一种方法可以使这项工作容易一点 如果您想要独立于平台的代码,或者不想在代码中包含任何额外的库,比如读

对于
boost::shared_mutex
,是否有C++11等价物。或者另一种解决方案来处理C++11中的多读/单写器情况?

简单。。。没有。没有标准的C++实现锁。 但是,你有几个选择

  • 您只能使用自己的设备来锁定自己的读写器
  • 使用特定于平台的实现,如或您提到的
  • 一点也不要使用——使用C++11中已经存在的
  • 使用#1并实现您自己的是一项可怕的任务,如果您没有正确理解,您可能会用竞争条件来迷惑代码。有一种方法可以使这项工作容易一点

    如果您想要独立于平台的代码,或者不想在代码中包含任何额外的库,比如读写器锁,您可以将#2抛出窗口

    而且,#3还有一些大多数人没有意识到的警告:使用读写器锁通常性能较差,并且比使用简单互斥体的等效实现更难理解代码。这是因为在readers-writer锁实现的幕后必须进行额外的簿记


    我只能向你介绍你的选择,实际上,这取决于你权衡每种选择的成本和收益,并选择哪种效果最好


    编辑:
    C++17现在有一种类型,适用于具有多个并发读卡器的好处大于
    共享互斥体本身的性能成本的情况。

    我尝试将
    共享互斥体
    导入C++11,但失败。它被提议作为未来的标准。这项建议是正确的

    编辑:C++14的修订版(N3659)

    下面是一个实现:


    不,在C++11中没有与之等价的
    boost::shared_mutex

    C++14或更高版本支持读/写锁,但:

    • 添加了C++14
    • 添加了C++17
    不同之处在于
    std::shared_timed_mutex
    添加了额外的定时操作。它实现了,这是由
    std::shared_mutex
    实现的simpler的扩展


    请记住,获取读/写互斥锁比获取普通互斥锁的成本更高。因此,如果执行频繁但较短的读取操作,读/写互斥锁将不会提高性能。它更适合于读操作频繁且昂贵的场景。引自:

    锁定共享_互斥体的成本高于锁定共享_互斥体的成本 普通std::互斥,即使对于读线程也是如此。这是一个必要的部分 功能性——一个系统有更多可能的状态 shared_mutex比mutex更有效,代码必须正确处理它们。这 成本来自对象的大小(在您的 实现和我的POSIX实现都包括一个普通互斥锁 和一个条件变量),以及锁定和解锁的性能 行动

    此外,共享互斥体是一个争用点,因此不是 可伸缩。锁定共享_互斥体必然会修改 互斥锁,即使是读锁。因此,保存 共享互斥体状态必须传输到指定的处理器 执行锁定或解锁操作

    如果有很多线程执行频繁的短读操作, 然后在多处理器系统上,这会导致大量缓存 乒乓球,这将极大地影响运动员的表现 系统。在这种情况下,您也可以采用更简单的设计 使用普通互斥,因为读卡器本质上是序列化的

    如果读取不频繁,则不存在争用,因此您不需要 需要担心并发读卡器,一个简单的互斥就足够了 不管怎样,在这种情况下

    如果读取操作非常耗时,那么 争论是不太明显的,因为它是相形见绌的时间花在 保持读锁。但是,执行耗时的操作 同时持有锁是一种设计气味

    在绝大多数情况下,我认为有更好的方法 共享互斥的替代方案。这些可能是一个简单的互斥体,即原子互斥体 支持共享的ptr,使用精心构造的并发 容器或其他内容,具体取决于上下文


    boost::shared_mutex
    被标准化委员会拒绝。这可能是相关的:@AndyProwl:我支持Nawaz的观点。我同意共享锁不是一个很好的解决方案,因为您可以在一小段时间内保持锁。但这并不总是可能的。如果是这样的话,共享锁定在这么多的库和语言中就不会那么普遍了。特别是,我发现“在持有锁的同时进行耗时的操作是一种设计上的气味”完全不能令人信服。要么“设计气味”意味着“一些永远不会发生的事情”,在这种情况下,它肯定是错误的输入法(考虑到“足以避免严重的缓存乒乓”并不是需要花费很多时间),要么“设计气味”意味着“一个令人担忧的信号,表明可能存在问题,但在某些情况下仍然是必要的”,在这种情况下,为什么要通过从提案中删除rwlock来撤销对这些情况的支持?@Nawaz:但这只是一个论点,即存在rwlock并不比互斥更好的情况(在其他地方,Willams解释了为什么有时更糟糕)。这是真的,但这不是移除RWlock的好理由。您不妨删除
    向量
    ,因为有时候
    deque
    更好。我不是说委员会没有充分的理由不包括共享互斥,只是这个解释不是(我希望)