gpt4 book ai didi

c - 为什么在 Petersons 算法中需要内存栅栏

转载 作者:行者123 更新时间:2023-12-04 09:31:17 24 4
gpt4 key购买 nike

bool in_critical[2] = {false,false}; 
int turn;

enter(int me, int other) {
(S1:) in_critical[me] = true;
(S2:) turn = other;

while(in_critical[other] && (turn == other)) ;
}

exit(int me) {
in_critical[me] = false;
}
以上是彼得森算法的简单实现。
在不同的在线资源中,它指出在 while(..) 之前需要内存栅栏。为了防止来自 out-of-order execution 的问题.所以 S1 and S2的顺序不交换。
但我无法发现这会是一个问题的确切星座。所以我的问题是:在哪个确切的重新排序中可能会出现问题?
或者,如果这更多的是一致性问题。所以也许 in_critical[me]永远不会被写出,两个处理器可能只是在内部使用它(CPU 寄存器永远不会写入缓存)。在那种情况下,两个处理器都会进入临界区。
并且内存栅栏会强制使 in_critical[me]可见的。

最佳答案

假设系统可以对 S1 和 S2 重新排序。这样就可以同时将两个进程放入临界区。
P0 通过设置 turn = 1 开始(重新排序)。 P1 下一步,设置 in_critical[1] = trueturn = 0 ,然后读取 false来自 in_critical[0]在 while 条件下并进入临界区。现在P0有转机,写in_critical[0] = true (重新排序),阅读 true来自 in_critical[1]但是 0来自 turn ,所以 P0 也进入临界区。

关于c - 为什么在 Petersons 算法中需要内存栅栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62831222/

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