【发布时间】:2013-02-14 06:34:09
【问题描述】:
这是一个由两部分组成的问题,都是关于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++ 历来有“只为你使用的东西付费”的口头禅。如果我不使用多个线程,或者如果我使用多个线程但没有跨线程共享指针所有权,那么原子智能指针就过分了。我的第二个问题是为什么 C++11 中没有提供std::shared_ptr 的非原子版本? (假设有一个为什么)(如果答案只是“根本没有考虑过非原子版本”或“从来没有人要求过非原子版本”,那很好!)。
关于问题 #2,我想知道是否有人曾提出过 shared_ptr 的非原子版本(向 Boost 或标准委员会提出)(不是要取代 shared_ptr 的原子版本,而是与它)并且由于特定原因被击落。
【问题讨论】:
-
您在这里究竟关心什么“成本”?原子递增整数的成本?对于任何实际应用,这实际上是您关心的成本吗?还是您只是过早地优化?
-
@NicolBolas:好奇心比什么都重要;我(目前)没有任何代码/项目我非常想使用非原子共享指针。但是,我有一些项目(过去),其中 Boost 的
shared_ptr由于其原子性而显着放缓,并且定义BOOST_DISABLE_THREADS产生了明显的差异(我不知道std::shared_ptr是否会有相同的成本boost::shared_ptr拥有)。 -
@Close voters:问题的哪一部分没有建设性?如果第二个问题没有具体的 why ,那很好(一个简单的“根本没有考虑过”将是一个足够有效的答案)。我很好奇是否存在特定的原因/理由。我会说,第一个问题肯定是一个有效的问题。如果我需要澄清这个问题,或者对它做一些细微的调整,请告诉我。但我看不出它有什么建设性。
-
@Cornstalks 好吧,这可能只是人们对他们很容易将其视为“过早优化”而忽略的问题反应不佳,无论它们多么有效,多么恰当或相关的问题是,我猜。我自己认为没有任何理由将其关闭为非建设性的。
-
(不能写答案现在它已经关闭,所以评论)当你的程序不使用多线程时使用 GCC
shared_ptr不使用原子操作作为引用计数。请参阅gcc.gnu.org/ml/libstdc++/2007-10/msg00180.html 处的 (2) 以获取 GCC 的补丁,以允许即使在多线程应用程序中也可以使用非原子实现,用于线程之间不共享的shared_ptr对象。我多年来一直坐在那个补丁上,但我正在考虑最终将它提交给 GCC 4.9
标签: c++ c++11 smart-pointers