gpt4 book ai didi

c++ - 是否有 std::shared_ptr 的非原子等价物?为什么 中没有一个?

转载 作者:IT老高 更新时间:2023-10-28 12:02:31 25 4
gpt4 key购买 nike

这是一个由两部分组成的问题,都是关于 std::shared_ptr 的原子性的。 :

1.据我所知,std::shared_ptr<memory> 中唯一的智能指针那是原子的。我想知道是否有 std::shared_ptr 的非原子版本可用(我在 <memory> 中看不到任何内容,因此我也愿意接受标准之外的建议,例如 Boost 中的建议)。我知道boost::shared_ptr也是原子的(如果 BOOST_SP_DISABLE_THREADS 未定义),但也许还有另一种选择?我正在寻找与 std::shared_ptr 具有相同语义的东西,但没有原子性。

2. 我明白为什么 std::shared_ptr是原子的;这有点好。然而,它并不适用于所有情况,C++ 历来有“只为你使用的东西付费”的口头禅。如果我没有使用多个线程,或者如果我使用多个线程但没有跨线程共享指针所有权,那么原子智能指针就过分了。我的第二个问题是为什么不是 std::shared_ptr 的非原子版本?在 C++11 中提供? (假设有一个为什么)(如果答案只是“根本没有考虑过非原子版本”或“没有人要求过非原子版本”,那很好!)。

关于问题 #2,我想知道是否有人提出过 shared_ptr 的非原子版本。 (对于 Boost 或标准委员会)(不是要替换 shared_ptr 的原子版本,而是要与之共存)并且由于特定原因而被击落。

最佳答案

1. I'm wondering if there is a non-atomic version of std::shared_ptr available

标准未提供。 “第 3 方”库很可能提供了一个。事实上,在 C++11 和 Boost 之前,似乎每个人都编写了自己的引用计数智能指针(包括我自己)。

2. My second question is why wasn't a non-atomic version of std::shared_ptr provided in C++11?

这个问题在 2010 年的 Rapperswil session 上进行了讨论。该主题是由瑞士的国家机构第 20 号意见提出的。辩论的双方都有强烈的论据,包括你在问题中提供的论据。然而,在讨论结束时,绝大多数(但不是一致)投票反对添加 shared_ptr 的非同步(非原子)版本。 .

反对的论点:

  • 使用未同步的 shared_ptr 编写的代码最终可能会在以后的线程代码中使用,最终导致难以调试的问题而没有警告。

  • 拥有一个“通用的”shared_ptr,它是引用计数流量的“一种方式”,它有好处:来自the original proposal :

    Has the same object type regardless of features used, greatly facilitating interoperability between libraries, including third-party libraries.

  • 原子的成本虽然不是零,但也不是压倒性的。通过使用不需要使用原子操作的移动构造和移动分配来减轻成本。 vector<shared_ptr<T>>中常用此类操作删除和插入。

  • 没有什么能阻止人们编写自己的非原子引用计数智能指针,如果这确实是他们想要做的事情。

那天在拉珀斯维尔的 LWG 的最后一句话是:

Reject CH 20. No consensus to make a change at this time.

关于c++ - 是否有 std::shared_ptr 的非原子等价物?为什么 <memory> 中没有一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15129263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com