std :: atomic如何确保原子性

Kra*_*ken 4 c++ atomic

如果我有一个代码a = a + 1,现在我明白了,有执行此需要多个CPU级别的操作,但如何definining astd::atomic<int>使这些多个事务的原子?

它是否会改变CPU指令的执行方式.我假设它必须以某种方式将指令数量减少到1,这样任何上下文切换都不会导致不可靠的结果,但它是如何做到的呢?

如果编译器总能创建这样的代码,为什么不总是这样做呢?

Mat*_*her 6

如果存在可以发出的原子指令(对于已知的可能的原子操作),则发出该原子指令,否则它将具有锁定机制.

有一个函数(C++ 17)告诉你原子类型是否总是无锁:is_always_lock_free.请注意,如果此函数返回false,则至少某些操作不是无锁的(不一定是所有操作).这些非无锁操作通常比原子操作更昂贵(它们本身比传统操作更昂贵).

并非所有硬件都支持所有原子操作组合,因此不同的编译器后端将生成不同的解决方案,有时使用单个原子操作,有时使用锁定机制.

所以它不能总是创建这样的1指令代码.