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
的指针传递给新线程,但在新线程有机会获取它自己的副本之前销毁它。
您仍然负责编写线程安全逻辑。但是您可以相信引用计数是线程安全的。
全部: 根据 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
的指针传递给新线程,但在新线程有机会获取它自己的副本之前销毁它。
您仍然负责编写线程安全逻辑。但是您可以相信引用计数是线程安全的。