Multithreading 当有一个读写器线程时,我需要使用std::atomic吗
我希望在读写器场景中使用std::shared\u ptr。一个线程不断地接收新信息,并保持一个指向最新数据的智能指针。当需要运行慢速计算时,我会使用一个智能指针指向所有数据,以确保查看的是一致的数据。在下面的例子中,当我使用a和b时,我知道它们属于一起 我不确定我是否应该在这里使用atomic_load和atomic_store?我不在乎我在看哪个版本的Foo,只要它是一致的和有效的 那么,我应该在智能指针上使用atomic,以便让代码从两个不同的线程工作吗 谢谢 保罗Multithreading 当有一个读写器线程时,我需要使用std::atomic吗,multithreading,c++11,shared-ptr,stdatomic,Multithreading,C++11,Shared Ptr,Stdatomic,我希望在读写器场景中使用std::shared\u ptr。一个线程不断地接收新信息,并保持一个指向最新数据的智能指针。当需要运行慢速计算时,我会使用一个智能指针指向所有数据,以确保查看的是一致的数据。在下面的例子中,当我使用a和b时,我知道它们属于一起 我不确定我是否应该在这里使用atomic_load和atomic_store?我不在乎我在看哪个版本的Foo,只要它是一致的和有效的 那么,我应该在智能指针上使用atomic,以便让代码从两个不同的线程工作吗 谢谢 保罗 #包括 #包括 福班{
#包括
#包括
福班{
公众:
INTA;
int b;
};
类MyClass{
公众:
std::共享的\u ptr lastValue;
void realTimeUpdate(Foo*latest){//拥有Foo的所有权
lastValue=std::shared_ptr(latest);//不使用std::atomic可以这样做吗?
};
void doSlowCalcFromAnotherThread(){
//引用所有输入数据
std::shared\u ptr stablevelue=lastValue;//不使用std::atomic可以吗_
//显示a和b保证它们来自同一消息
std::cout是的,必须以某种方式保护两个线程之间的任何通信。这种情况下的问题是std::shared\u ptr::operator=
不保证是原子的,因此如果两个线程都在访问它,则可能会调用未定义的行为
默认情况下,shared_ptr::operator=不是原子的
shared_ptr不是可复制的,因此它不能作为std::atomic的模板参数
因此,您必须以其他方式同步它们,例如通过std::mutex。是的,您必须使用std::atomic\u load()
和std::atomic\u store()
在内存头中为std::shared\u ptr
参数重载。否则,代码中会有数据竞争。(根据问题的标记,我假设您有一个兼容C++11的编译器。)您可能应该使用std::mutex
来保护对指针的访问,并将其终止。std::shared_ptr
的赋值不是原子的。我希望使用类似于如果您有一个c++11编译器,那么您就可以这样做!一切都会很好的谢谢。不幸的是,gcc 4.9.2似乎没有实现std::std::shared_ptr的原子_加载和存储,因此我必须坚持使用互斥。C++17可能包括一个std::atomic_shared_ptr,它在这些情况下应该可以工作,但在它可用之前还需要一段时间。
#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;
};
};