当有一个阅读器和一个编写器线程

时间:2016-04-04 21:05:03

标签: multithreading c++11 shared-ptr stdatomic

我希望在读者/编写器场景中使用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;
  };
};

3 个答案:

答案 0 :(得分:2)

  1. shared_ptr :: operator =默认情况下不是原子。
  2. shared_ptr不是TriviallyCopyable,因此它不能是std :: atomic的模板参数。
  3. 所以你必须以其他方式同步'em,例如通过std :: mutex。

答案 1 :(得分:2)

是的,您必须在grep -a2 current-branch .repo/repo/subcmds/sync.py of a project from server. The -c/--current-branch option can be used to only fetch objects that are on the branch specified by a project's revision. -- dest='detach_head', action='store_true', help='detach projects back to manifest revision') p.add_option('-c', '--current-branch', dest='current_branch_only', action='store_true', help='fetch only current branch from server') 标头中使用std::atomic_load()std::atomic_store()重载memory参数。否则,您将在代码中进行数据竞争。 (我假设您根据问题的标签有一个符合C ++ 11标准的编译器。)

答案 2 :(得分:1)

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