首页 > 解决方案 > C++20 中的原子智能指针和互斥锁

问题描述

如果我想从多个线程写入/读取一个对象,即使我在 C++11 中使用 shared_pointer,我也必须使用额外的互斥锁来保证线程安全。如果我使用 C++20 中引入的 atomic_shared_pointer,这仍然适用吗?

问候

标签: c++thread-safetymutexc++20

解决方案


在考虑shared_ptr.

  1. 引用计数的原子性。也就是说,您shared_ptr在不同的线程上有两个对象,但它们都访问相同的托管引用计数。当您shared_ptr在一个线程上复制一个并删除shared_ptr引用相同引用计数的另一个时会发生什么?

    shared_ptr在这些情况下提供对竞争条件的保证。不同实例的引用计数上的数据竞争shared_ptr永远不会发生。

  2. shared_ptr对象本身的原子性。也就是说,您有一个 被不同线程引用shared_ptr的对象。一个线程可能想要替换' 的存储对象或其他东西,但此时其他人可能正在访问它。shared_ptr

    C++20atomic<shared_ptr>处理这种情况。如果对象是,那么您可以通过通常的界面atomic<shared_ptr>玩这些游戏。atomicC++11 有许多原子访问器函数可以达到相同的效果,只要所有代码都使用这些访问器。

  3. a所指事物的原子性shared_ptr。在这种情况下,多个线程可能正在使用多个不同shared_ptr的对象,但所有这些shared_ptr对象都指向同一个对象。这些线程想要访问它们所指向的对象。

    这种原子性完全取决于你shared_ptr的原子性保证是关于对指针的访问,而不是它指向的内容。如果您需要同步访问所指向的内容,则必须自己构建。


推荐阅读