all: 根据此页面,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;
}
````
正如上面代码所示,如果func2中的复制构造发生在A1的内部参考计数减少之后,则指针将被删除两次,对吗?
原子参考计数确保只有参考计数是安全的。它不会将引用类变成线程安全类。它不会阻止您编写线程安全代码,例如将std::shared_ptr
指针传递给新线程,而是在新线程有机会获取自己的IT副本之前将其销毁。
您仍然负责编写线程安全逻辑。但是您可以依靠参考计数是线程安全的。