java - 彼得森解决方案的实现工作不正常

标签 java multithreading algorithm

<分区>

我的学校给出了 Peterson 解决方案的实现。我有一些问题。 您可以在最后找到完整的代码。

首先;两个线程(AddOne 和 SubOne)以相同的进程值“0”进入和离开临界区是否正确。

PetersonsSolution.enter_region(0); //Both use 0 as paramater.

代码的输出是这样的:

++ finihed
-- finished
Result: 0
++ finihed
-- finished
Result: -49
-- finished
++ finihed
Result: -64
++ finihed
-- finished
Result: -54
...ans so on

我认为如果彼得森的解决方案按预期工作,结果必须等于 0。但它们都是不同的。

所以我像这样更改 AddOne 类:给一个不同的参数。

class AddOne extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {

            PetersonsSolution.enter_region(1); //give 1 as paramater.
            PetersonsSolution.myValue++;
            PetersonsSolution.leave_region(1); //give 1 as paramater.

        }
        System.out.println("++ finihed");
    }

}

这给了我预期的结果:

-- finished
++ finihed
Result: 0
++ finihed
-- finished
Result: 0

但这一次,一两秒后程序进入无限循环并且不在屏幕上打印任何内容。我认为它停留在这个 while(turn == process && interested[other])

我的问题是;

  1. 给出不同的工艺参数以获得 预期结果(结果:0)?
  2. 如果它是正确的,为什么它会在一段时间后卡住?

谢谢大家!

Peterson 的解决方案实现:

public class PetersonsSolution {

    static int myValue = 0;
    static int turn;
    static boolean interested[] = {false, false};

    public static void main(String[] args) throws Exception {
        while (true) {

            AddOne add = new AddOne();
            SubOne sub = new SubOne();

            add.start();
            sub.start();

            add.join();
            sub.join();

            System.out.println("Result: " + myValue);
        }
    }

    public static void enter_region(int process){
        int other;
        other = 1 - process;
        interested[process] = true;
        turn = process;

        while(turn == process && interested[other]){
            //System.out.println("waiting");
        }
    }

    public static void leave_region(int process){
        interested[process] = false;
    }

}

class AddOne extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {

            PetersonsSolution.enter_region(0);
            PetersonsSolution.myValue++;
            PetersonsSolution.leave_region(0);

        }
        System.out.println("++ finihed");
    }

}

class SubOne extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {

            PetersonsSolution.enter_region(0);
            PetersonsSolution.myValue--;
            PetersonsSolution.leave_region(0);

        }
        System.out.println("-- finished");
    }
}

最佳答案

如果两个线程访问共享状态,并且至少有一个线程修改了这个共享状态,则需要同步。您的代码没有任何同步,因此输出是不确定的。

阅读http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html ,和/或阅读 Brian Goetz 的 Java Concurrency in Practice。

关于java - 彼得森解决方案的实现工作不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26325865/

相关文章:

c - 如何使用 MPI 将链表共享给所有进程

javascript - 堆栈交换站点列表页面中的框重排算法

algorithm - 处理大量的微依赖

java - 我对 XPath 做错了什么?

java - 如果用户离开 JSF 中的页面,数据库连接会关闭吗?

python - pytest 在单独的线程中失败

如果给定集合,则找到列表的最佳组合的算法

java - 文件扫描程序无限期挂起

java - android 互联网连接错误失败

c# - async await是否增加上下文切换