有 3 个 shared_ptr 对象 x、g、n; 两个工作线程:
void main(){
shared_ptr g(new Foo); // 线程之间共享的 shared_ptr
shared_ptr x; // 线程 A 的局部变量
shared_ptr n(new Foo); // 线程 B 的局部变量
std::thread([&]{
x = g;
}).detach();
std::thread([&]{
g = n;
}).detach();
getchar();
}
假如shared_ptr是线程安全的或者忽略shared_ptr线程安全问题,预期的结果为同一线程执行结果(这是错的):
shared_ptr g(new Foo);//heap1
shared_ptr x;
shared_ptr n(new Foo);//heap2
x = g;
g = n;
//此时x指向heap1引用计数为1,g、n执行heap2引用计数为2
return;
分析主例子多线程:
race condition下,引用计数混乱,错误未知,造成wild pointer/memory leak/crash。
参考:c++ std::shared_ptr(内存布局)_vczxh的博客-CSDN博客