1 Star 0 Fork 0

huyi / TechCPP

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
C++的atomic-bool代码底层是如何实现的?.md 2.06 KB
一键复制 编辑 原始数据 按行查看 历史
葛昆仑 提交于 2024-02-05 03:54 . update: 6 articles

在C++中,std::atomic 是一个模板类,用于提供对基础类型的原子操作。std::atomic<bool> 是该模板类针对布尔类型的特化。原子操作保证了即使在多线程环境中,每个操作也是不可分割的,从而避免了竞态条件。

std::atomic<bool> 底层实现通常依赖于硬件和编译器的支持来提供原子性保证。具体实现可能涉及以下几个方面:

  1. 内存屏障(Memory Barriers/Fences): 内存屏障用于确保指令的执行顺序,阻止编译器或者处理器重排操作顺序。
  2. 锁前缀指令(Lock Prefix): 在x86架构中,处理器提供了带有LOCK前缀的指令,比如LOCK XCHG,它可以将操作变为原子性的。当CPU执行带有LOCK前缀的指令时,会确保指令完整执行,期间不会被其他处理器打断。
  3. 特殊的原子指令: 现代处理器提供了一系列原子指令,比如XADD(交换并加),CMPXCHG(比较并交换)等,可以用来实现原子变量。对于布尔变量,可能会使用这些指令来实现无锁的原子读写操作。
  4. 编译器内建函数(Compiler Intrinsics): 编译器可能提供特殊的内建函数来映射到底层的原子指令。

例如,在GCC和Clang上,通常会使用GCC的内建函数来实现原子操作。例如:

bool old_value = __atomic_fetch_and(&my_atomic_bool, true, __ATOMIC_SEQ_CST);

这里的 __atomic_fetch_and 函数是GCC提供的内建函数,用于执行原子AND操作,并返回变量的旧值。第三个参数 __ATOMIC_SEQ_CST 表示使用最严格的内存顺序:Sequentially Consistent。

对于不支持原子指令的数据类型或复杂操作,可能需要使用锁(比如互斥锁)来保证操作的原子性。但由于 bool 类型非常简单,大多数平台都能够提供无锁的原子操作支持。

不同的平台和编译器可能有不同的实现方式,因此没有一个统一的实现细节。如果你想知道具体的实现,可以查看特定编译器的源代码或者汇编输出。

1
https://gitee.com/hylhm/TechCPP.git
git@gitee.com:hylhm/TechCPP.git
hylhm
TechCPP
TechCPP
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891