Boost C++ 库

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

Next

第1章。 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 进行线程协调
通过互斥强制 先发生 (happens-before) 关系
通过 releaseacquire 强制 先发生 (happens-before) 关系
栅栏 (Fences)
通过 releaseconsume 强制 先发生 (happens-before) 关系
顺序一致性 (Sequential consistency)
编程接口
配置和构建
内存顺序
原子标志
原子对象
原子引用
等待和通知操作
用于进程间通信的原子类型
栅栏 (Fences)
特性测试宏
使用示例
引用计数
自旋锁
双重检查锁定模式的单例
无等待环形缓冲区
无锁多生产者队列
局限性
移植
单元测试
已测试的编译器
更新日志
致谢

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

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

该实现尽可能利用特定于处理器的指令(通过内联汇编器、平台库或编译器内联函数),并回退到通过锁定“模拟”原子操作。

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

void function()
{
  n ++;
}

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

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

原子变量对于两个目的很有用

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

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


Next