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