gpt4 book ai didi

c - 用 `memory_order_seq_cst` 排序原子

转载 作者:行者123 更新时间:2023-12-04 11:01:10 25 4
gpt4 key购买 nike

我对C11的阅读spec with regards to atomic operation ordering建议 memory_order_seq_cst适用于对特定原子对象的操作。

大多数情况下,描述的形式是“如果 A 和 B 应用于 M,则顺序保持在 M”

我的问题是,如果我们有两个应用于不同 原子对象的操作,具体会发生什么。类似于以下内容:

atomic_store(&a, 20);
atomic_store(&b, 30);

哪里ab是原子( volatile )类型(并且 atomic_store 表示 memory_order_seq_cst )。

此问题与内存映射情况有关,其中内存映射表示某些外设的寄存器。

对写入的顺序有要求是完全正常的。比方说 a = 20正在为我们的导弹外围设备设置目标并设置 b = 30是启动命令。显然,我们不想在导弹正确瞄准之前发射。

如果它有什么不同,这是在带有 GCC 的 ARM Linux 上。

最佳答案

同一线程中的两次内存访问始终按顺序进行,如果它们发生,并且它们之间存在序列点。

如果这两个对象被声明为 volatile,则“if they happen”部分在这里得到保证。这迫使编译器有效地将加载或存储发送到内存。编译器如何做到这一点,以及他如何为此提供保证,完全取决于实现。为此请阅读您的平台文档。

语句的顺序与 volatile 或原子没有太大关系。它由语法暗示。一个好的经验法则是每个 ;{} 都有一个序列点, ?||&&。 (不止这些,但如果你想和他们讲道理,事情就变得复杂了)。

这些都与原子无关。这些是为了保证操作的不可分割性和线程之间以及信号处理程序之间的数据一致性。这里最重要的是对操作的副作用具有可证明的可见性。这是相对复杂的,但是当您想讨论同一线程中发生的事情时,这对您没有任何帮助。相反,线程之间的“先于发生”关系依赖于各个线程内的“先于顺序”关系。

关于c - 用 `memory_order_seq_cst` 排序原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43092357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com