gpt4 book ai didi

c++ - 最低订购要求

转载 作者:行者123 更新时间:2023-12-02 10:22:23 25 4
gpt4 key购买 nike

xystd::atomic<int>类型的两个不同变量,并假定它们的当前值为1。什么是最宽松的订购要求集,以便以下代码生成一些输出? (即order1 ... order4应该使用什么?)

// Thread 1
x.store(0, order1); // A
if(0 == y.load(order2)) // B
std::cout << '1'; // C
// Thread 2
y.store(0, order3); // E
if(0 == x.load(order4)) // F
std::cout << '2'; // G

最佳答案

您需要所有操作的顺序一致性。

Release / acquire实际上并未在此处强加任何顺序,因为在release-store之前没有存储,而在acquired-load之后没有加载,这将由它进行排序。

轻松在任何商店中进行内存排序,例如x.store可能导致商店在两个线程中以不同顺序可见。然后,它不会违反其余操作的顺序排序,以使宽松的存储在另一个线程中加载之后可见,而另一个存储在其相应的加载之后仍以顺序一致的总顺序进行排序。

通过对所有操作进行顺序排序,可以确保输出,因为必须在所有线程中以相同的方式观察到顺序操作的总顺序。该顺序必须与线程中的排序顺序一致,即x.store < y.loady.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语句之一。

如果例如 x.store不是 memory_order_seq_cst,因此,尽管仍需要在线程1中的 y.load之前对其进行排序,但它可能在线程2中的 x.load之后变得可见。

然后 y.load < y.store < x.load仍将满足其他操作的顺序一致性,并且无论如何都将满足 x的修改顺序。

关于c++ - 最低订购要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59531445/

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