c++ - 多线程 std::shared_ptr 读/写

标签 c++ smart-pointers

我使用 std::shared_ptr 时遇到了双重释放错误,并试图了解原因。我在多线程环境中使用shared_ptr,一个线程有时会替换全局数组中的某些元素

std::shared_ptr<Bucket>  globalTable[100]; // global elements storage

使用:

globalTable[idx].reset(newBucket);

另一个线程有时使用以下方式读取此表:

std::shared_ptr<Bucket> bkt(globalTable[pIdx]);
// do calculations with bkt-> items

此后我收到双重释放错误,AddressSanitizer 表示第二个代码尝试释放被第一个代码破坏的对象。怎么可能?据我所知,shared_ptr 必须是完全线程安全的。

最佳答案

并非 std::shared_ptr 上的所有操作都是线程安全的。

具体来说,引用计数是以原子方式管理的,但有责任确保您访问的 std::shared_ptr 实例不会同时被修改。

您没有履行这一责任,导致数据争用和预期的未定义行为,在您的情况下表现为双重释放。

关于c++ - 多线程 std::shared_ptr 读/写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48968500/

相关文章:

c++ - 我怎样才能创建树?

C++ uWebSockets 在一个线程中集成事件循环

c++ - std::unique 指针和自定义 lambda 删除器错误

c++ - 从具有成员函数的共享指针的 std::vector 中移除_if

c++ - 在复制构造函数中复制唯一指针数组的内容

c++ - 指向非 union 类的指针的大小可以不同吗?

c++ - 加载库时出错

c++ - 我可以获得在键盘上按下某个键的时间量吗

c++ - 进入智能指针,如何处理代表所有权?

c++ - 如何在最后一个客户端完成时删除持久对象的实例