|
|
1
6
如果有可以发出的原子指令(对于已知的可能的原子操作),那么就发出这个原子指令,否则它将具有锁机制。
有一个函数(C++ 17)告诉你原子类型是否始终是无锁的:
并非所有硬件都支持原子操作的所有组合,因此不同的编译器后端将生成不同的解决方案,有时使用单个原子操作,有时使用锁定机制。 所以它不能总是创建这样的单指令代码。 |
|
|
2
3
它不会使“多个事务”在任意表达式中成为原子(例如,它在
您可以通过检查生成的程序集来检查编译器和硬件组合的行为。有时这很棘手,因为编译器可能调用在运行时库中实现的函数,在这种情况下,您必须检查该函数的源代码或反汇编。这意味着,如果运行库实现不同,相同的二进制文件可以在不同的主机上具有不同的原子操作实现!
编译器并不总是生成这些,因为它们在硬件级别上很昂贵。例如,正常(非原子)添加通常需要1个周期或更少 二 在大多数现代CPU上 一 ,而原子加成可能需要15到100个周期。使用cas或ll-sc的方法通常更慢,需要重试循环,这会增加二进制文件的大小。 一 在一些微控制器类CPU上可能有几个周期,但是原子操作通常不那么重要,因为可能没有多个核心。 二 这取决于你如何测量它-一个加法通常需要一个周期 完成 (延迟),但您通常可以在同一个周期中执行多个独立的加法。例如,现代Intel CPU可以在一个周期内执行四个。 |