我希望在读者/编写器场景中使用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;
};
};
答案 0 :(得分:2)
所以你必须以其他方式同步'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=
不能保证是原子的,因此如果两个线程都在访问它,则可能会调用未定义的行为