Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Не пойму как работает код. Несколько потоков, семафор. / 3 сообщений из 3, страница 1 из 1
08.04.2014, 10:07
    #38607987
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не пойму как работает код. Несколько потоков, семафор.
Всем привет. Разбираюсь с примером на семафоры и не пойму как работает код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
public class MyProg
{ public static void main( String args[] )
{ Semaphore sem0=new Semaphore(1);
    Semaphore sem1=new Semaphore(1);
    Worker myThread0=new Worker ("Worker0", sem0, sem1);
    Worker myThread1=new Worker ("Worker1", sem0, sem1);
    myThread0.start();
    myThread1.start();
}
}
class Worker extends Thread
{ private Semaphore sem0, sem1;

    public Worker(String n, Semaphore s0, Semaphore s1)
    {super(n);
        sem0=s0;
        sem1=s1;
    }

    public void run()
    {for (int i=1; i<=3; i++)
    {int x=(int)(Math.random()*2);
        System.err.println("x="+x);
        if (x==0)
        {System.err.println(this.getName()+" calls sem0.P()");
            sem0.P();
            criticalSection0();
            System.err.println(this.getName()+" calls sem1.P()");
            sem1.P();
            criticalSection1();
            System.err.println(this.getName()+" calls sem1.V()");
            sem1.V();
            System.err.println(this.getName()+" calls sem0.V()");
            sem0.V();}
        else
        {System.err.println(this.getName()+" calls sem1.P()");
            sem1.P();
            criticalSection1();
            System.err.println(this.getName()+" calls sem0.P()");
            sem0.P();
            criticalSection0();
            System.err.println(this.getName()+" calls sem0.V()");
            sem0.V();
            System.err.println(this.getName()+" calls sem1.V()");
            sem1.V();}
    }
        System.err.println( this.getName()+": THE END");
    }

    public void criticalSection0()
    {System.err.println(this.getName()+"  ENTERS THE CRITICAL SECTION 0");
        try
        {Thread.sleep((int)(Math.random()*3000));}
        catch (InterruptedException e) {}
        System.err.println(this.getName()+"  EXITS FROM CRITICAL SECTION 0");
    }
    public void criticalSection1()
    {System.err.println(this.getName()+"  ENTERS THE CRITICAL SECTION 1");
        try
        {Thread.sleep((int)(Math.random()*3000));}
        catch (InterruptedException e) {}
        System.err.println(this.getName()+"  EXITS FROM CRITICAL SECTION 1");
    }
}

class Semaphore
{
    public Semaphore(int v)
    { value = v; }

    public void P()
    { while (value <= 0);
        value --;
    }

    public void V()
    { ++value;  }

    private int value;
}



Выводится в консоль за раз только один из потоков. Почему не оба? А иногда программа подвисает. Запускаю в intellij idea
И ещё, что значат термины - Deadlocks and Starvation, они относятся к этому примеру.

Спасибо.
...
Рейтинг: 0 / 0
08.04.2014, 10:55
    #38608079
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не пойму как работает код. Несколько потоков, семафор.
mr_virtusВсем привет. Разбираюсь с примером на семафоры и не пойму как работает код:

Выводится в консоль за раз только один из потоков. Почему не оба? А иногда программа подвисает. Запускаю в intellij idea
И ещё, что значат термины - Deadlocks and Starvation, они относятся к этому примеру.

Спасибо.

Если 2 потока идут по разным веткам: Worker0 : x=0, Worker1: x=1 вот тут и DeadLock
Worker0 : sem0.P(); v=0;
Worker1 : sem1.P(); v=0;
Worker0 : sem1.P(); цикл
Worker1 : sem0.P(); цикл
...
Рейтинг: 0 / 0
08.04.2014, 11:05
    #38608099
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не пойму как работает код. Несколько потоков, семафор.
0FD,
точно. Оба пытаются зайти в секции, которые заняты ими самимы.

Спасибо большое!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Не пойму как работает код. Несколько потоков, семафор. / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]