c++ - std::atomic 如何保证原子性

标签 c++ atomic

如果我有密码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/

相关文章:

c++ - 如何将 linc 传递给类函数并调用它?

c++ - Windows GUI + 控制台输出,Linux 风格

c++ - 为什么Windows gcc(cygwin)不写ELF头?

c++ - decltype(auto) 从 lambda 捕获中推导出返回类型

Node.js - 使用 Redis 原子更新进行扩展

C++ OPENSSL 库 HMAC 函数返回值每次运行时都不一样?

c++ - 了解 C++ 内存模型 : Different values on different runs

c++ - 无锁列表删除

java - 有什么好的方法可以通过 JDBC 原子地执行 MySQL 语句吗?

java - 单例对象工厂 : is this code thread-safe?