【问题标题】:C++ std::atomic vs. Boost atomicC++ std::atomic 与 Boost atomic
【发布时间】:2012-03-22 01:05:33
【问题描述】:

在我的应用程序中,我有一个 int 和一个 bool 变量,它们由多个线程访问(多次写入/读取)。目前,我正在使用两个互斥锁,一个用于 int,一个用于 bool 来保护这些变量。

我听说过使用原子变量和运算符来编写无锁多线程程序。我的问题是

  1. 原子变量和运算符的定义是什么?
  2. std::atomicboost/atomic.hpp?哪个更标准或更流行?
  3. 这些库是否依赖于平台?我正在使用 gnu gcc 4.6 目前是 Linux,但理想情况下它应该是跨平台的。我听说“原子”的定义实际上也取决于硬件。谁能解释一下?
  4. 在多个线程之间共享布尔变量的最佳方式是什么?我不想使用“volatile”关键字。

这些代码是线程安全的吗?

double double_m; // double_m is only accessed by current thread.
std::atomic<bool> atomic_bool_x;
atomic_bool_x = true && (double_m > 12.5);

int int_n; // int_n is only accessed by current thread.
std::atomic<int> atomic_int_x;
std::atomic<int> atomic_int_y;
atomic_int_y = atomic_int_x * int_n;

【问题讨论】:

  • 一次有很多问题要问。另外,您是在问 C++ 标准库是否是……标准的?和平台相关?

标签: c++ multithreading atomic


【解决方案1】:

我不是专家或任何东西,但这是我所知道的:

  1. std::atomic 只是说同时调用 loadstore(以及一些其他操作)是明确定义的。原子操作是不可分割的——“中间”不会发生任何事情。
  2. 我假设std::atomic 是基于boost::atomic。如果可以,请使用std,否则请使用boost
  3. 它们都是可移植的,std 完全可以移植,但是您的编译器需要支持 C++11
  4. 可能是std::atomic_bool。您应该不需要使用 volatile。

另外,我相信load/storeoperator=/operator T 不同只有load/store 是原子的

没关系。我检查了标准,似乎运算符是根据load/store/etc 定义的,但是它们可能返回不同的东西。

进一步阅读:

【讨论】:

  • 其实Boost.Atomic是基于标准原子库的。
  • 此外,加载和存储不仅仅是不可分割的。它们还定义了内存排序要求。仅当您指定 memory_order_relaxed 时,它们才只是不可分割的。
【解决方案2】:

Volatile 与您用来实现原子的东西是正交的。在 C++ 中,它告诉编译器使用该变量执行优化是不安全的。 Herb Sutters 阐述了这一点:

要安全地编写在不使用锁的情况下在线程之间进行通信的无锁代码,最好使用有序的原子变量:Java/.NET volatile、C++0x atomic 和 C 兼容 atomic_T。

要安全地与特殊硬件或其他具有异常语义的内存通信,请使用不可优化的变量:ISO C/C++ volatile。但是请记住,这些变量的读取和写入不一定是原子的。

最后,要表达一个既具有不寻常的语义又具有无锁编码所需的任何或所有原子性和/或顺序保证的变量,只有 ISO C++0x 草案标准提供了一种直接的拼写方式: 挥发性原子。

(来自http://drdobbs.com/article/print?articleId=212701484&siteSectionName=parallel

【讨论】:

    【解决方案3】:
    1. std::atomic class template
    2. std::atomic 是自 C++11 以来的标准,而 Boost 的东西较旧。但既然现在是标准的,我更喜欢std::atomic
    3. ??您可以在所需的每个平台上将 std::atomic 与每个 C++11 编译器一起使用。
    4. 没有任何进一步的信息......

      std::atomic;

    【讨论】:

      【解决方案4】:

      我相信std::atomic (C++11) 和boost.atomic 是等价的。如果您的编译器还不支持std::atomic,请使用boost::atomic

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 2021-06-08
        • 2018-07-25
        • 1970-01-01
        • 2014-10-01
        • 2015-08-25
        相关资源
        最近更新 更多