C++shared_ptr如何保证线程安全?

C++ shared_ptr how to ensure thread safety?

全部: 根据 this page,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中的拷贝构造发生了,指针将被删除两次,对吗?

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

您仍然负责编写线程安全逻辑。但是您可以相信引用计数是线程安全的。