版权所有 © 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
,因为对该变量的每个操作都是原子的:这意味着每个操作的行为就好像它是相对于其他操作严格顺序执行的。
原子变量有两个用途
请查看示例部分了解常见模式。