C++标准::原子与Boost原子
C++ std::atomic vs. Boost atomic
在我的应用程序中,我有一个int和一个bool变量,它们由多个线程访问(多次写入/读取)。目前,我正在使用两个互斥对象,一个用于int,另一个用于bool来保护这些变量。
我听说过使用原子变量和运算符来编写无锁多线程程序。我的问题是
- 原子变量和运算符的定义是什么
- std::atomic和boost/atomic.hpp?哪一个更标准还是更受欢迎
- 这些库是否依赖于平台?我在上使用gnu gcc 4.6Linux,但理想情况下它应该是跨平台的。我听说"原子"的定义实际上也取决于硬件。有人能解释一下吗
- 在多个线程之间共享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;
我不是专家,但我知道的是:
std::atomic
简单地说,同时调用load
和store
(以及一些其他操作)是定义良好的。原子操作是不可分割的——"中间"不会发生任何事情- 我假设
std::atomic
是基于boost::atomic
。如果可以,使用std
,否则使用boost
- 它们都是可移植的,
std
完全是这样,但是您的编译器需要支持C++11 - 可能是
std::atomic_bool
。您不应该使用volatile
此外,我认为load
/store
与operator=
/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=并行)
- 请参阅std::atomic类模板
std::atomic
是C++11之后的标准,Boost的东西更老。但由于它现在是标准的,我更喜欢std::atomic
- ??您可以将
std::atomic
与所需平台上的每个C++11编译器一起使用 -
没有任何进一步的信息。。。
std::原子;
我相信std::atomic
(C++11)和boost.atomic
是等价的。如果编译器还不支持std::atomic
,请使用boost::atomic
。
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- std::原子加载和存储都需要吗
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- boost::asio::io_service::p ost 是原子的吗?
- 为什么 Boost 原子使用中的多生产者队列是免等待的
- boost::原子编译问题
- boost::shared_ptr,CTOR 中有一个原子增量,但 DTOR 中有两个原子递减
- boost与std原子顺序一致性语义
- C++标准::原子与Boost原子
- 为什么boost::互斥使用原子操作和事件,而不是关键部分
- Boost::端序和非1字节原子端序
- Boost原子类使初始值不同于成员初始化列表
- 等待Boost的空闲队列.原子示例崩溃
- c++11和boost之外的原子变量