繁体   English   中英

C ++ std :: atomic vs. Boost atomic

[英]C++ std::atomic vs. Boost atomic

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

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

  1. 原子变量和运算符的定义是什么?
  2. std :: atomicboost / atomic.hpp之间的主要区别是什么? 哪一个更标准或更受欢迎?
  3. 这些库是否依赖于平台? 我目前在Linux上使用gnu gcc 4.6,但理想情况下它应该是跨平台的。 我听说“原子”的定义实际上也取决于硬件。 任何人都可以解释一下吗?
  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 / store不同于operator= / operator T 只有load / store是原子的

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

进一步阅读:

易失性与您用于实现原子的方法正交。 在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=parallel

  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM