powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Не пойму как работает код. Несколько потоков, семафор.
3 сообщений из 3, страница 1 из 1
Не пойму как работает код. Несколько потоков, семафор.
    #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
Не пойму как работает код. Несколько потоков, семафор.
    #38608079
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
Не пойму как работает код. Несколько потоков, семафор.
    #38608099
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD,
точно. Оба пытаются зайти в секции, которые заняты ими самимы.

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


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