gpt4 book ai didi

Java - Dekkers 算法实现导致临界区中有两个线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:07:31 25 4
gpt4 key购买 nike

我正在尝试针对有两条铁路的场景实现 Dekkers 算法,并且有一点它们都使用轨道的同一部分。一次只能允许一列火车进入该路段,并且一列火车可以连续通过任意多次,除非其他列车都已转弯并且它已准备好通过。

下面是我为第一条铁轨实现的代码。

while (allowed) {
choochoo();
setWantToUseTrack(0,true);
while (getWantToUseTrack(1)) {
if (getTurn() != 0) {
setWantToUseTrack(0,false);
while (getTurn() != 0) {
//wait loop
}
setWantToUseTrack(0, true);
}
}
//critical section starts
crossPass();
//critical section ends
setTurn(1);
setWantToUseTrack(0,false);
}
}

下面是我实现第二条铁轨的代码。

while (allowed) {
choochoo();
setWantToUseTrack(1,true);
while (getWantToUseTrack(0)) {
if (getTurn() != 1) {
setWantToUseTrack(1,false);
while (getTurn() != 1) {
//wait loop
}
setWantToUseTrack(1,true);
}
}
//critical section starts
crossPass();
//critical section ends
setTurn(0);
setWantToUseTrack(1,false);
}

当这段代码运行时,有时两列火车会同时进入临界区。我看不到逻辑错误。我在实现中遗漏了什么吗?

最佳答案

有可能发生以下情况(仅举一个例子):

  1. 在第二首轨道中调用 setWantToUseTrack(1,false);
  2. 在第一个跟踪谓词被检查:while (getWantToUseTrack(1)),到第二个线程在while循环中没有停止。

    这是绝对可行的,因为第一个轨道可以被 choochoo(); 停止,直到 (1.) 和第二个轨道直到 (2.) 发生。

  3. 方法 getWantToUseTrack 为 0 和 1 返回 false

创建一个循环来捕获线程直到释放临界区有点危险。您可能希望通过将 synchronizedcrossPass 定义结合使用来使该部分线程安全。

关于Java - Dekkers 算法实现导致临界区中有两个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54871863/

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