4

我希望在读取器/写入器场景中使用 std::shared_ptr 。一个线程不断接收新信息并保持一个指向最新数据的智能指针。当需要运行我的慢速计算时,我将智能指针指向所有数据,以确保我正在查看一致的数据。在下面的示例中,当我使用 a 和 b 时,我知道它们属于一起。

我不确定我是否应该在这里使用 atomic_load 和 atomic_store ?只要它是一致且有效的,我并不关心我正在查看哪个版本的 Foo。

那么我应该在我的智能指针上使用 atomic 以便让这段代码在两个不同的线程中工作吗?

谢谢,

保罗

#include <iostream>
#include <memory>


class Foo{
public:
    int a;
    int b;
};

class MyClass{
public:
  std::shared_ptr <Foo> lastValue;
  void realTimeUpdate (Foo* latest) { //takes ownership of Foo
      lastValue=std::shared_ptr <Foo> (latest); //Is this OK to do without using std::atomic_?
  };

  void doSlowCalcFromAnotherThread () {
      //take a reference to all input data
      std::shared_ptr <Foo> stableValue=lastValue; //Is this OK to do without using std::atomic_
      //display a and b guaranteed that they come from the same message
      std::cout<<"a: "<<stableValue->a<<std::endl;
      std::cout<<"b: "<<stableValue->b<<std::endl;
  };
};
4

3 回答 3

2

是的,您必须在标头中使用std::atomic_load()std::atomic_store()重载参数。否则,您将在代码中出现数据竞争。(我假设您根据问题的标签有一个符合 C++11 的编译器。)memorystd::shared_ptr

于 2016-04-05T06:33:08.853 回答
2
  1. shared_ptr::operator= 默认情况下不是原子的。
  2. shared_ptr 不是 TriviallyCopyable,因此它不能是 std::atomic 的模板参数。

所以你必须以其他方式同步它们,例如通过std::mutex。

于 2016-04-04T21:17:11.867 回答
1

是的,必须以某种方式保护两个线程之间的任何通信。这种情况下的问题std::shared_ptr<>::operator=是不能保证是原子的,因此如果两个线程都在访问它,可能会调用未定义的行为

于 2016-04-04T21:09:58.683 回答