C++ C++;共享线程如何确保线程安全?
全部: 根据C++实现,通常使用原子REF计数来确保线程安全,但在某些情况下这似乎是错误的。p> ```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的内部引用计数减少之后,指针将被删除两次,对吗?原子引用计数确保只有引用计数是线程安全的。它不会将引用的类转换为线程安全类。它不会阻止您编写线程不安全的
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;
}