【问题标题】:Do shared pointers use atomic operations in reference counting even in a single threaded program即使在单线程程序中,共享指针是否在引用计数中使用原子操作
【发布时间】:2019-08-13 08:09:55
【问题描述】:

为了多线程安全,std::shared_ptr 使用原子操作来执行引用计数。虽然这很好,但我有以下问题:

  1. 如果程序是单线程程序,是否有足够聪明的编译器来使用普通(非原子)递增和递减操作?
  2. 按照上面的问题,如果答案是否定的,有没有办法告诉编译器他的程序是单线程的,所以在编译的时候不要费心使用原子操作?

【问题讨论】:

标签: c++ multithreading shared-ptr atomic compiler-optimization


【解决方案1】:
  1. 这取决于编译器。 Visual Studio 2017 不够智能。我不知道 clang 会做什么(我不是每天都使用它们),但我敢打赌它们也不是那么聪明。正如@yachoor 在评论中指出的那样“Linux 上的 g++ 足够聪明——如果程序没有与 pthread 链接,它不会对 std::shared_ptr 使用原子操作”

  2. 不确定,但没有标准方法可以做到这一点。看看at this. 您可以使用 std::move 运算符,这样就不会增加引用。如果不是这样,我认为没有简单的方法可以做到这一点。

关于第 2 点,还有其他可能性。您可以提取指向该对象的指针并将其作为引用传递到程序中需要的任何地方。由于它是单线程的,因此您应该非常确定该对象的生命周期。否则,您可能需要重新考虑您的内存所有权设计。

【讨论】:

  • g++ 在 Linux 上足够聪明 - 如果程序没有与 pthread 链接,它不会对 std::shared_ptr 使用原子操作
  • @yachoor,是不是说如果一个程序没有和pthread链接,共享指针就不是线程安全的,不能和std::thread一起使用?
  • @vahancho 如果不链接pthread,则不能使用std::thread
  • @vahancho std::thread 在 linux 上的 libstdc++ 中是使用 pthreads 实现的,所以如果你使用 std::thread 你必须使用 pthread 链接,否则会出现链接器错误
  • @yachoor,molbdnilo,啊,好的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多