描述WebAssembly线程的文档中写道:
原子加载/存储内存访问的行为与非原子访问类似,只是访问顺序是顺序一致的。
这是指i32.atomic.load
与i32.load
、i32.atomic.store
与i32.store
等。
非原子操作的顺序不一致意味着什么?在什么情况下,非原子操作是不合适的?
原子操作的内存一致性定义了处理器如何相对于其他变量对原子访问进行排序(的最低要求(。这与内存屏障有关。松弛的原子操作使原子操作独立于其他变量进行排序。这意味着,如果你这样做:
non_atomic_variable = 42;
atomic_increment(atomic_variable);
然后,当atomic_variable
已经被当前线程增加时,其他线程可能看不到non_atomic_variable
的更新值。这在顺序一致的内存排序中是不可能的,因为编译器应该使用指令,这样当增加完成并且原子操作(例如读取(从其他线程排序时,就会有内存屏障迫使其他线程看到更新的值。
顺序一致的内存排序是安全的,但也很慢。放松的内存排序很快,因为同步较弱(加载/存储期间处理器优化的空间更大(。例如,对于宽松的内存排序,处理器可以稍后执行non_atomic_variable
,因为缓存未命中(由于无序执行(。对于顺序一致的内存排序,增量需要等待存储完成,当缓存未命中时,这可能需要一些时间。
请注意,处理器的内存排序可能比软件堆栈所需的更强(例如,x86-64处理器具有强大的内存排序(。