首页 >后端开发 >C++ >一个线程可以从 C 11 原子变量读取陈旧数据吗?

一个线程可以从 C 11 原子变量读取陈旧数据吗?

DDD
DDD原创
2024-12-13 17:53:10300浏览

Can One Thread Read Stale Data from a C  11 Atomic Variable?

并发:了解 C 11 内存模型中的原子性和易失性

考虑由在不同内核上同时运行的多个线程访问的全局变量。每个线程都可以写入和读取变量。一个线程可以从原子变量中读取过时的信息吗?

易失性和原子:区别

虽然原子意味着原子访问,但单独的易失性并不意味着原子访问。 Volatile 可用于内存映射 I/O 和信号处理等情况。当与 std::atomic 配对时,它变得多余。此外,它与原子访问或线程间内存顺序无关。

原子变量的内存排序

C 11 中的 std::atomic 库提供了一个原子整数类型,

 std::atomic<int>;人工智能; 

可见性和排序限制取决于为操作提供的内存排序:
  • 序列一致性排序 (std::memory_order_seq_cst):为所有操作维护单一总排序所有变量。它不保证过时的值不存在,但它确保获得的值由操作在排序中的位置决定。
  • 宽松排序 (std::memory_order_relaxed):删除任何排序约束,允许最佳速度,但存在不可预测的执行顺序的风险。

读取-修改-写入(RMW) 操作:保证新鲜度

RMW 操作,如 Exchange()、compare_exchange_strong() 和 fetch_add(),提供了保证:它们始终作用于最新值。在多个线程对 ai.fetch_add(1) 的一系列调用中,不会返回重复或缺失的数字。但是,线程可能会在不同的时间点看到这些值。

注意事项和结论

理解原子操作至关重要。建议在生产代码中使用它们之前进行彻底的研究和代码审查。锁通常提供一种更易于访问且几乎同样高效的并发方法。

以上是一个线程可以从 C 11 原子变量读取陈旧数据吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn