【问题标题】:What were the reasons for excluding upgrade locks from the N3568 proposal从 N3568 提案中排除升级锁的原因是什么
【发布时间】:2017-03-16 23:23:28
【问题描述】:

我对此进行了一些谷歌搜索,并设法找到了很少的信息。 N3568 包含升级锁概念的规范,但升级部分是 rejected during the standardisation process and a revised proposal was accepted (N3569),排除了它们但包含了其他部分。

目前boost::thread 中存在升级锁的实现,并且很想使用它们。但我很好奇这个概念在使用之前被标准化委员会拒绝的具体原因。

问题:

  • 为什么从 N3568 中排除的升级锁被拒绝?
  • 使用boost::thread 实现的危险是什么 升级锁,有什么已知问题吗?
  • 升级锁是否会出现在标准中? 被认为存在严重缺陷?

【问题讨论】:

    标签: c++ multithreading boost c++14


    【解决方案1】:
    • 为什么从 N3568 中排除的升级锁被拒绝?

    并发组认为为upgrade_mutex 确定单个升级线程并不实际。

    并发小组认为升级工具会使互斥锁变得更加昂贵(它没有在参考实现中)。

    没有兴趣将 upgrade_mutex 放入 C++14(在并发子组中)。

    (这些是会议纪要的引述)

    • 使用 boost::thread 实现升级锁有什么危险,是否有任何已知问题?

    如果定义了BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0,shared_mutex 将提供升级功能。这是一个坏主意。出于类型安全的原因,shared_mutex 和 upgrade_mutex 具有不同的类型非常重要。需要在编译时强制执行哪个互斥锁具有升级能力,因为它的升级锁定状态在其他争夺升级锁定的线程中是独占的。

    我对 boost upgrade_mutex 的研究还不够多,无法知道它与 N3568 有何不同,因此无法对此发表评论。

    • 升级锁会出现在标准中还是被认为存在严重缺陷?

    我不认为它们存在严重缺陷。但是它们的实际用例比shared_mutex 少,而shared_mutex 的实际用例比mutex 少。因此,大量观众不需要它们。但是当您需要时,它非常方便。

    除非有人(更可能是一大群人)选择投入时间和金钱来做到这一点,否则它们永远不会成为标准。那个人不会是我,除非我得到一大群人的支持,他们非常希望它出现在标准会议上并投票支持它。我不希望这种情况发生,因为用例非常少。

    不幸的是,程序员无法完全靠自己实现这一点,因为这会涉及对unique_lock 和shared_lock 的侵入性更改(三种锁类型之间的转换)。 “程序员无法实现”是将某些东西放入 std::lib 的动机之一。但是“没有足够广泛的需要”也是将事情排除在 std::lib 之外的一个原因。正是这最后一点需要草根运动来反驳,否则它实际上是正确的。

    【讨论】:

    • 非常感谢您的详细回复!您能否提供更多关于“认为为 update_mutex 识别单个升级线程不切实际”的详细信息。我不确定是否隐含了实际考虑。另外,应该读作“upgrade_mutex”吗?
    • @radman:我从会议纪要中复制/粘贴了那句话,只修改了演讲者和公司隶属关系(出于隐私目的)。我在场,但时间已经够长了,我不想冒险猜测我可能没有正确回忆的细节。会议纪要中没有进一步的细节。
    • 虽然这似乎是一个明显的拼写错误,但我可以在这里更正...
    • 好的,不用担心,尽力而为:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2019-06-22
    • 2010-09-08
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多