所有: 根据{{3}} c ++实现,通常使用原子引用计数来确保线程安全,但在某些情况下这似乎是错误的。
```
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;
}
```
如上面的代码所示,如果在内部引用计数a1减少后func2中的复制结构发生了,那么指针将被删除两次,对吗?
答案 0 :(得分:4)
原子引用计数确保只有引用计数是线程安全的。它不会将引用的类转换为线程安全类。它不会阻止您编写线程不安全的代码,例如将指针传递给std::shared_ptr
到新线程,但在新线程有机会获取它自己的副本之前销毁它。 / p>
您仍然负责编写线程安全逻辑。但是你可以依赖引用计数是线程安全的。