gpt4 book ai didi

c++ - 在多线程环境中使用 auto_ptr 交换对象而不锁定是安全的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:04 24 4
gpt4 key购买 nike

我在堆上分配了一些数据结构,它们很少被修改但需要快速读取访问。一个例子是在堆上分配的结构,许多线程以只读方式非常频繁地访问它。需要定期重写此结构并避免锁定争用我想知道使用 auto_ptr 是否安全基本上允许已获取引用的线程继续处理直到它们完成writer 创建结构的拷贝,重写它并快速与结构的新 auto_ptr 实例交换指针。

我从 Java 中的 CopyOnWriteArrayList 得到这个想法,并希望在 C++ 中执行类似的性能。

最佳答案

std::auto_ptr 在调用非常量成员(例如 reset() )时没有任何线程安全保证正如你所建议的。此外, std::unique_ptr 也没有您应该将其视为 auto_ptr 的替代品作为auto_ptr已被有效弃用。

std::shared_ptr 确实提供了这样的线程安全保证。

shared_ptr 通常可以保证什么是引用计数是以原子方式操作的,这意味着您在创建 shared_ptr 的拷贝时不会发生数据竞争。 ,前提是目前没有人在修改 shared_ptr就在那一刻。

为您的 shared_ptr 考虑以下用例.你有一个全局 shared_ptr<string> sharedString;当前指向 std::string 的一个实例.许多线程调用 get() 是安全的检索指向字符串的指针。他们也可以像这样创建自己的共享指针:shared_ptr<string> myString = sharedString; ,前提是没有人改变共享指针指向的内容。

现在,让我们返回并修复示例中存在的竞争条件。当需要更改全局共享指针指向的内容时,线程可能正在制作它的拷贝——这是一个问题,因为它可能使拷贝处于不一致的状态。因此,我们必须确保以原子方式更改和复制它。

幸运的是,shared_ptr提供了一些 C++11 原子操作的特化: atomic_load , atomic_store , 和 atomic_exchange .

复制 shared_ptr 时, 使用 atomic_load ,并在更新 shared_ptr 时, 使用 atomic_store .

这样做很重要,原因有二。

  1. atomic_* 操作为您提供了一种线程安全的方式来复制共享指针。
  2. 制作拷贝意味着当全局共享指针更改时,您的拷贝仍指向旧字符串,因此您的代码不必担心它所操作的数据在不期望的情况下发生更改。

现在,重要的是要注意在 shared_ptr 上使用线程安全操作不为其指向的类型提供任何线程安全。您始终必须注意所指向的对象是否以线程安全的方式使用。

关于c++ - 在多线程环境中使用 auto_ptr 交换对象而不锁定是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14175303/

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