C++标准::原子与Boost原子

C++ std::atomic vs. Boost atomic

本文关键字:Boost 原子 标准 C++      更新时间:2023-10-16

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

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

  1. 原子变量和运算符的定义是什么
  2. std::atomicboost/atomic.hpp?哪一个更标准还是更受欢迎
  3. 这些库是否依赖于平台?我在上使用gnu gcc 4.6Linux,但理想情况下它应该是跨平台的。我听说"原子"的定义实际上也取决于硬件。有人能解释一下吗
  4. 在多个线程之间共享bool变量的最佳方式是什么?我不希望使用"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;

我不是专家,但我知道的是:

  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/等定义的,但它们可能返回不同的内容。

进一步阅读:

  • http://en.cppreference.com/w/cpp/atomic/atomic
  • C++11标准
  • C++操作中的并发

Volatile与用于实现原子的内容正交。在C++中,它告诉编译器使用该变量执行优化是不安全的。Herb Sutters展示了它:

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

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

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

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

  1. 请参阅std::atomic类模板
  2. std::atomic是C++11之后的标准,Boost的东西更老。但由于它现在是标准的,我更喜欢std::atomic
  3. ??您可以将std::atomic与所需平台上的每个C++11编译器一起使用
  4. 没有任何进一步的信息。。。

    std::原子;

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