Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 当有一个读写器线程时,我需要使用std::atomic吗_Multithreading_C++11_Shared Ptr_Stdatomic - Fatal编程技术网

Multithreading 当有一个读写器线程时,我需要使用std::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,以便让代码从两个不同的线程工作吗 谢谢 保罗 #包括 #包括 福班{

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