并发:了解 C 11 内存模型中的原子性和易失性
考虑由在不同内核上同时运行的多个线程访问的全局变量。每个线程都可以写入和读取变量。一个线程可以从原子变量中读取过时的信息吗?
易失性和原子:区别
虽然原子意味着原子访问,但单独的易失性并不意味着原子访问。 Volatile 可用于内存映射 I/O 和信号处理等情况。当与 std::atomic 配对时,它变得多余。此外,它与原子访问或线程间内存顺序无关。
原子变量的内存排序
C 11 中的 std::atomic 库提供了一个原子整数类型,
std::atomic<int>;人工智能;
读取-修改-写入(RMW) 操作:保证新鲜度
RMW 操作,如 Exchange()、compare_exchange_strong() 和 fetch_add(),提供了保证:它们始终作用于最新值。在多个线程对 ai.fetch_add(1) 的一系列调用中,不会返回重复或缺失的数字。但是,线程可能会在不同的时间点看到这些值。
注意事项和结论
理解原子操作至关重要。建议在生产代码中使用它们之前进行彻底的研究和代码审查。锁通常提供一种更易于访问且几乎同样高效的并发方法。
以上是一个线程可以从 C 11 原子变量读取陈旧数据吗?的详细内容。更多信息请关注PHP中文网其他相关文章!