我阅读C11 spec with regards to atomic operation ordering表明memory_order_seq_cst
适用于特定原子对象的操作。
大多数情况下,描述的形式为“如果A和B应用于M,那么订单将保留在M”
我的问题具体是如果我们有两个适用于不同原子对象的操作会发生什么。如下所示:
atomic_store(&a, 20);
atomic_store(&b, 30);
其中a
和b
是原子(易变)类型(atomic_store
暗示memory_order_seq_cst
)。
此问题与存储器映射情况有关,其中存储器映射表示某些外设的寄存器。
有关写入顺序的要求是完全正常的。假设a = 20
正在设置我们的导弹外围设备的目标,并且设置b = 30
是启动命令。显然,我们不希望在导弹正确定位之前发射。
如果它对任何事情产生影响,那么这是在带有GCC的ARM Linux上。
答案 0 :(得分:2)
同一个线程中的两个内存访问总是排序,如果它们发生,并且它们之间有一个序列点。
" 如果发生的部分"如果声明了两个对象volatile
,则保证在此处。这会强制编译器有效地发出加载或存储到内存。编译器如何执行此操作以及如何为此提供保证,完全取决于实现。请阅读平台文档。
语句的顺序与volatile
或原子语无关。它是由语法暗示的。一个好的经验法则是每个;
,,
,{
,}
,?
,||
和&&
。 (还有更多,但如果你想用它们推理,事情就变得复杂了。)
没有什么是关于原子的。这些是为了保证线程之间和信号处理程序之间的操作和数据一致性的不可分割性。这里最重要的是让可证明的可见操作的副作用。这是相对复杂的,但当你想讨论在同一个线程中发生的事情时,它并没有帮助你。恰恰相反,"发生在"线程之间的关系,依赖于"之前排序的"各个线程内的关系。