gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:21 26 4
gpt4 key购买 nike

我有一个使用 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 必须是完全线程安全的。

最佳答案

重置并不能保证线程安全。

如此处所述,分配和引用计数是线程安全的

To satisfy thread safety requirements, the reference counters are typically incremented using an equivalent of std::atomic::fetch_add with std::memory_order_relaxed (decrementing requires stronger ordering to safely destroy the control block).

如果多个线程访问同一个 shared_ptr,您可能会出现竞争条件。

If multiple threads of execution access the same shared_ptr without synchronization and any of those accesses uses a non-const member function of shared_ptr then a data race will occur; the shared_ptr overloads of atomic functions can be used to prevent the data race.

您的函数 reset 是非常量,因此属于该类别。您需要使用互斥锁或其他同步机制。

http://en.cppreference.com/w/cpp/memory/shared_ptr

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com