Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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
C++ C++;共享线程如何确保线程安全?_C++_Multithreading_Pointers_Shared - Fatal编程技术网

C++ C++;共享线程如何确保线程安全?

C++ C++;共享线程如何确保线程安全?,c++,multithreading,pointers,shared,C++,Multithreading,Pointers,Shared,全部: 根据C++实现,通常使用原子REF计数来确保线程安全,但在某些情况下这似乎是错误的。p> ``` void func2(共享){ 共享ptr a(*x); *a+=1; } 线程func1(){ 共享ptr a1(新int(10)); 螺纹t(功能2和a1); 返回t; } ``` 如上面的代码所示,如果func2中的复制构造发生在a1的内部引用计数减少之后,指针将被删除两次,对吗?原子引用计数确保只有引用计数是线程安全的。它不会将引用的类转换为线程安全类。它不会阻止您编写线程不安全的

全部: 根据C++实现,通常使用原子REF计数来确保线程安全,但在某些情况下这似乎是错误的。p> ```

void func2(共享){
共享ptr a(*x);
*a+=1;
}
线程func1(){
共享ptr a1(新int(10));
螺纹t(功能2和a1);
返回t;
}
```


如上面的代码所示,如果func2中的复制构造发生在a1的内部引用计数减少之后,指针将被删除两次,对吗?

原子引用计数确保只有引用计数是线程安全的。它不会将引用的类转换为线程安全类。它不会阻止您编写线程不安全的代码,比如将指向std::shared_ptr的指针传递给新线程,但会在新线程有机会获取其自身副本之前将其销毁

您仍然负责编写线程安全逻辑。但是你可以依靠引用计数来保证线程安全。

这里的错误是你的代码。。。悬空的原始指针。
void func2(shared_ptr<int>* x) {
  shared_ptr<int> a(*x);
  *a += 1;
}

thread func1() {
 shared_ptr<int> a1(new int(10));
 thread t (func2, &a1);
 return t;
}