Boost C++ 库

...世界上最受尊敬和专家设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

Next

第一章 Boost.Atomic

Helge Bahmann

Andrey Semashev

根据 Boost 软件许可证,版本 1.0 进行分发。(请参阅随附文件 LICENSE_1_0.txt 或复制于 https://boost.ac.cn/LICENSE_1_0.txt

目录

简介
Boost.Atomic 介绍
目的
使用 Boost.Atomic 进行线程协调
通过互斥来强制执行先行发生关系
通过 releaseacquire 建立先行发生关系
栅栏
通过 releaseconsume 建立先行发生关系
顺序一致性
编程接口
配置和构建
内存顺序
原子标志
原子对象
原子引用
等待和通知操作
用于进程间通信的原子类型
栅栏
特性测试宏
使用示例
引用计数
自旋锁
使用双重检查锁定模式的单例
无等待环形缓冲区
无锁多生产者队列
限制
移植
单元测试
已测试的编译器
变更日志
致谢

Boost.Atomic 是一个库,它提供了 atomic 数据类型和对这些数据类型的操作,以及通过原子变量协调多个线程所需的内存顺序约束。它实现了 C++11 标准定义的接口,但使此功能可用于缺少对此特定 C++11 功能的系统/编译器支持的平台。

该库的用户应该已经熟悉一般的并发性,以及诸如“互斥”之类的基本概念。

该实现尽可能使用处理器特定的指令(通过内联汇编、平台库或编译器内部函数),并在无法使用时通过加锁来“模拟”原子操作。

对“普通”变量的操作不能保证是原子的。这意味着,如果初始值为 int n=0,则两个线程并发执行

void function()
{
  n ++;
}

可能会导致 n==1 而不是 2:每个线程都会将旧值读取到处理器寄存器中,将其递增,然后将结果写回。因此,两个线程都可能写入 1,而不知道另一个线程也在这样做。

如果声明为 atomic<int> n=0,则对该变量执行相同的操作将始终导致 n==2,因为对该变量的每个操作都是原子的:这意味着每个操作的行为就好像它是相对于其他操作严格顺序执行的。

原子变量有两个用途

  • 作为通过自定义协调协议协调多个线程的一种方法
  • 作为对简单变量进行“锁定”访问的更快替代方案

请查看示例部分了解常见模式。


Next