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

标签 c++ c++11 smart-pointers

这是一个由两部分组成的问题,都是关于 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/

相关文章:

C++智能指针

c++ - 如何在嵌入式 v8 中解析 JSON?

c++ - 关于使用 boost::zip 迭代器的一些代码的问题

c++ - 直接结构初始化

c++ - 关于C++0x引用崩溃的问题

multithreading - 为什么这不编译? (RValue 作为线程 CTOR 参数)

c++ - Boost weak_ptr在多线程程序中实现资源池

c++ - 了解 unique_ptr get() 函数

c++ - Operator = function 和 add 函数似乎不能共存

c++ - 使用映射迭代器编译错误