Skip to content
This repository was archived by the owner on Feb 4, 2023. It is now read-only.

Commit 85e61b3

Browse files
committed
Add to PW
1 parent 2d76548 commit 85e61b3

File tree

2 files changed

+51
-42
lines changed

2 files changed

+51
-42
lines changed

2022.08.31_PW/Philosopher.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@ public class Philosopher
44
{
55
public string Name { get; set; }
66

7-
public void Eating()
7+
public void Eating(Fork fork1, Fork fork2)
88
{
9-
Thread.Sleep(5000);
9+
Console.WriteLine($"Философ {Name} кушает");
10+
//Thread.Sleep(5000);
11+
fork1.IsBusy = false;
12+
fork2.IsBusy = false;
1013
}
1114

1215
public void Thinking()
1316
{
14-
Thread.Sleep(5000);
17+
Console.WriteLine($"Философ {Name} думает");
18+
//Thread.Sleep(5000);
1519
}
1620
}
1721
}

2022.08.31_PW/Program.cs

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
namespace _2022._08._31_PW
1+
//Решение заключается в ограничении количества человек, которые могут подойти к месту, где лежат вилки. Это решение уходит
2+
//от максималньного быстродействия, но гарантирует, что все философы рано или поздно смогут поесть.
3+
4+
namespace _2022._08._31_PW
25
{
36
internal class Program
47
{
5-
static Semaphore semaphore = new(2,2);
8+
static object locker = new();
69
static List<Fork> forks = new() { new(), new(), new(), new(), new() };
710
static List<Philosopher> philosophers = new()
811
{
@@ -16,59 +19,61 @@ internal class Program
1619
static void Main()
1720
{
1821
Task.Run(ExitWait);
22+
List<Task> tasksCycles = new();
23+
foreach(Philosopher philosopher in philosophers)
24+
{
25+
tasksCycles.Add(new(()=> Cycle(philosopher)));
26+
}
27+
foreach(Task task in tasksCycles)
28+
{
29+
task.Start();
30+
}
31+
Task.WaitAll(tasksCycles.ToArray());
32+
}
33+
34+
static void Cycle(Philosopher philosopher)
35+
{
1936
while (true)
2037
{
21-
List<Task> tasks = new();
22-
semaphore.WaitOne();
23-
foreach (Philosopher philosopher in philosophers)
38+
philosopher.Thinking();
39+
bool goEat = false;
40+
Fork leftFork = null;
41+
Fork rightFork = null;
42+
lock (locker) //К выдаче вилок подходит может подойти только 1 человек!
2443
{
25-
Fork fork1 = null;
26-
Fork fork2 = null;
27-
for (int i = 0; i < forks.Count; i++)
28-
{
29-
if (!forks[i].IsBusy)
30-
{
31-
fork1 = forks[i];
32-
break;
33-
}
34-
}
35-
for (int i = 0; i < forks.Count; i++)
44+
foreach (Fork fork1 in forks) //Ищем первую вилку
3645
{
37-
if (!forks[i].IsBusy)
46+
if (!fork1.IsBusy) //Если есть свободная вилка
3847
{
39-
fork2 = forks[i];
48+
fork1.IsBusy = true; //Берём её
49+
foreach (Fork fork2 in forks) //Ищем вторую вилку
50+
{
51+
if (!fork2.IsBusy) //Если есть свободная вилка
52+
{
53+
fork2.IsBusy = true; //Берём её
54+
goEat = true; //Идём кушать
55+
leftFork = fork1;
56+
rightFork = fork2;
57+
break;
58+
}
59+
}
60+
fork1.IsBusy = false; //Если не была найдена вторая вилка - ложим вилку и останавливаем цикл
4061
break;
4162
}
4263
}
43-
if (fork1 != null && fork2 != null)
44-
{
45-
tasks.Add(Task.Run(() => Cycle(philosopher, fork1, fork2)));
46-
}
4764
}
48-
Task.WaitAll(tasks.ToArray());
49-
semaphore.Release();
65+
if (goEat) //А вот кушать за общим столом могут все вместе!
66+
{
67+
philosopher.Eating(leftFork, rightFork); //Вилки ложаться обратно внутри класса
68+
}
5069
}
5170
}
5271

53-
static void Cycle(Philosopher philosopher, Fork fork1, Fork fork2)
54-
{
55-
Console.WriteLine($"Философ {philosopher.Name} думает");
56-
philosopher.Thinking();
57-
fork1.IsBusy = true;
58-
fork2.IsBusy = true;
59-
Console.WriteLine($"Философ {philosopher.Name} кушает");
60-
philosopher.Eating();
61-
fork1.IsBusy = false;
62-
fork2.IsBusy = false;
63-
Console.WriteLine($"Философ {philosopher.Name} думает");
64-
philosopher.Thinking();
65-
}
66-
6772
static void ExitWait()
6873
{
6974
while (true)
7075
{
71-
if (Console.ReadKey().Key == ConsoleKey.Q)
76+
if (Console.ReadKey().Key == ConsoleKey.End)
7277
{
7378
Environment.Exit(0);
7479
}

0 commit comments

Comments
 (0)