您需要所有操作的顺序一致性。
Release/acquire 实际上并没有在这里强加任何排序,因为在 release-store 之前没有 store 或者在 acquire-load 之后没有加载,这将由它排序。
任何存储上的宽松内存排序,例如x.store
可能导致存储在两个线程中以不同的顺序变得可见。然后,它不会违反其余操作的顺序,以便在另一个线程中加载之后使松弛存储可见,而另一个存储仍然在其相应加载之后以顺序一致的总顺序进行排序。
保证所有操作输出的顺序排序,因为在所有线程中必须以相同的方式观察到顺序操作的总顺序。此顺序必须与线程中的排序顺序一致,即x.store < y.load
和y.store < x.load
。唯一的可能是:
x.store < y.load < y.store < x.load
x.store < y.store < x.load < y.load
x.store < y.store < y.load < x.load
y.store < x.load < x.store < y.load
y.store < x.store < y.load < x.load
y.store < x.store < x.load < y.load
所有这些都在存储之后观察其中一个变量的加载,从而触发其中一个cout
语句。
如果 eg x.store
is not memory_order_seq_cst
,那么虽然它仍然需要y.load
在线程 1 之前排序,但它可能在线程 2 之后变得可见x.load
。
y.load < y.store < x.load
然后仍然会满足其他操作的顺序一致性,并且x
无论如何都可以轻松满足的修改顺序。