版权所有 © 2011 Helge Bahmann
版权所有 © 2012 Tim Blechmann
版权所有 © 2013, 2017, 2018, 2020-2022 Andrey Semashev
根据 Boost 软件许可协议 1.0 版发布。(请参阅随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)
Boost.Atomic 是一个库,它提供了 atomic
数据类型以及对这些数据类型的操作,以及通过原子变量协调多个线程所需的内存顺序约束。它实现了 C++11 标准定义的接口,但使此功能可用于缺乏对该特定 C++11 功能的系统/编译器支持的平台。
该库的用户应该已经熟悉一般的并发性,以及诸如“互斥”之类的基本概念。
该实现尽可能利用特定于处理器的指令(通过内联汇编器、平台库或编译器内联函数),并回退到通过锁定“模拟”原子操作。
“普通”变量上的操作不能保证是原子的。这意味着,如果最初 int n=0
,两个线程并发执行
void function() { n ++; }
可能导致 n==1
而不是 2:每个线程都会将旧值读入处理器寄存器,递增它并将结果写回。因此,两个线程都可能写入 1
,而不知道另一个线程也在这样做。
声明 atomic<int> n=0
相反,对该变量的相同操作将始终导致 n==2
,因为对该变量的每个操作都是原子 (atomic) 的:这意味着每个操作的行为都好像它与其他操作严格地顺序执行一样。
原子变量对于两个目的很有用
查看 示例 部分以了解常见模式。