【问题标题】:atomic smart pointers and mutex in C++20C++20 中的原子智能指针和互斥锁
【发布时间】:2021-07-06 16:39:49
【问题描述】:

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

问候

【问题讨论】:

标签: c++ thread-safety mutex c++20


【解决方案1】:

在考虑shared_ptr 的原子性时,可以考虑三层。

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

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

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

    C++20 的atomic<shared_ptr> 处理这种情况。如果对象是atomic<shared_ptr>,那么您可以通过通常的atomic 界面玩这些游戏。 C++11 有a number of atomic accessor functions 可以达到同样的效果,只要所有代码都使用这些访问器。

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

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

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 2021-08-19
    • 2021-03-09
    • 1970-01-01
    • 2014-05-20
    • 2018-05-23
    • 1970-01-01
    • 2016-09-14
    相关资源
    最近更新 更多