【问题标题】:atomic_store of shared_ptr of interface接口 shared_ptr 的 atomic_store
【发布时间】:2017-10-29 23:47:54
【问题描述】:

我正在尝试以原子方式设置 shared_ptr 的值:

shared_ptr<Base> a = std::make_shared<Derived>();
....
shared_ptr<Base> b;
std::atomic_store(&b,a); // Error here

我收到错误消息“'std::shared_ptr' 不是从 'volatile std::atomic<_itp>' 派生的”

如何解决这个问题?谢谢。

【问题讨论】:

  • 基本上以线程安全的方式执行此操作的方法是使用互斥锁。您可能希望将共享指针和互斥锁包装在一个类中,以保证没有人可以在不获取互斥锁的情况下设置共享指针。
  • @NirFriedman mutex 不保证访问是不稳定的,所以不够好。
  • 嗯什么? Volatile 可能并不意味着您认为它会做什么,您应该阅读它。 stackoverflow.com/questions/36496692/….
  • 感谢您的链接。我仍然想要实现的是“线程间同步”,这意味着 var 值应该在线程之间被视为相同。 shared_ptr 有这个功能吗?
  • 引号不是必需的。互斥锁可能是实现线程间通信的最简单方法。将变量包装在互斥锁中意味着一次只有一个线程可以读取或写入互斥锁。因此,可以保证每个线程始终看到变量的一致值。该变量是 shared_ptr 还是其他东西都没有关系。

标签: c++11 shared-ptr atomic


【解决方案1】:

对于 std::shared_ptr 有一个 atomic_store 的特化,参见

http://en.cppreference.com/w/cpp/memory/shared_ptr/atomic

通过现代编译器(比如 GCC 5),您提供的代码编译得很好。所以我想你的编译器不完全支持 C++11(就像 GCC 4.x,缺乏专业化)。

【讨论】:

  • 谢谢。这确实是问题所在。
猜你喜欢
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多