如果我有密码a = a + 1
,现在我明白执行此操作需要多个 CPU 级别的操作,但是如何定义 a
作为std::atomic<int>
使这些多个事务成为原子?
它是否改变了 CPU 指令的执行方式。我假设它必须以某种方式将指令数减少到 1,这样任何上下文切换都不会导致不可靠的结果,但它是如何做到的呢?
如果编译器总是可以创建这样的代码,为什么不总是这样做呢?
最佳答案
如果有原子指令可以发出(对于已知可能的原子操作),则发出这条原子指令,否则会带锁机制。
有一个函数 (C++17) 可以告诉您原子类型是否始终是无锁的:is_always_lock_free
.
请注意,如果此函数返回 false
,至少某些操作不是无锁的(不一定是所有操作)。这些非无锁操作通常比原子操作更昂贵(它们本身比传统操作更昂贵)。
并非所有硬件都支持原子操作的所有组合,因此不同的编译器后端会生成不同的解决方案,有时是单个原子操作,有时是加锁机制。
所以它不能总是创建这样的 1 指令代码。
关于c++ - std::atomic 如何保证原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54279460/