Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/103: Рейтинг темы: голосов - 103, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 15

Обедающие философы

20.06.2010, 14:04. Показов 21524. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Нужна помощь в решении задач об обедающих философах с помощью семафоров, мониторов и блокировки. Также нужно добавить главный текст программы в модуль. Как это сделать?

Добавлено через 3 часа 35 минут
Не проходите мимо. Очень нуждаюсь в решении данного вопроса
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.06.2010, 14:04
Ответы с готовыми решениями:

Обедающие философы. Решение методом монитора
Здравствуйте. Ищу решения проблемы обедающих философов методом монитора( он же официант, арбитр и т.д.) Есть у кого готовый код?

Обедающие философы, перевод с Delphi
«Проблема обедающих философов» Программная реализация задачи на языке Delphi, нужно перевести в с# windows forms main.pas unit...

Обедающие философы
Здравствуйте участники форума я на форуме нашел программу про обедающих философов вот её исходники using System; using...

22
15 / 15 / 2
Регистрация: 24.07.2009
Сообщений: 59
20.06.2010, 15:27
можно по подробней?
0
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 15
20.06.2010, 15:31  [ТС]
Цитата Сообщение от kiril188 Посмотреть сообщение
можно по подробней?
http://alice.pnzgu.ru/~dvn/prolog/articls/9.htm

Суть задачи описывается здесь. Нужна помощь в реализации задачи. Сам не справляюсь, гуглить пытался - ничего толового.
0
Кодило
 Аватар для r0fL
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
20.06.2010, 15:51
Тебе не понятна именно реализация на c# или алгоритм?
0
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 15
22.06.2010, 02:55  [ТС]
Цитата Сообщение от r0fL Посмотреть сообщение
Тебе не понятна именно реализация на c# или алгоритм?
мне не понятно, как это все сотворить. получается мне по заданию нужно сделать 3 программы с 1 условием.

Добавлено через 20 часов 59 минут
Тема еще актуальна. Нужна помощь. Кто может помочь с этим вопросом - помогите!

Добавлено через 14 часов 2 минуты
C#
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace Philosopher
{
    public class Philosopher_1
    {
        public static void Phil_1_eat()
        {
            while (true)
            {
                Global.Think.WaitOne();
                Console.WriteLine("Философ 1 размышляет");
                Thread.Sleep(1000);
                Global.Think.Release();
 
                Global.ToHungry.WaitOne();
                Console.WriteLine("Философ 1 голоден");
                Thread.Sleep(1000);
                Global.FromHungry.Release();
 
            check_1:
                {
                    if (Global.vhod_control == 2)
                    {
                        Global.ToHungry.WaitOne();
                        Console.WriteLine("Философ 1 голоден");
                        Thread.Sleep(1000);
                        Global.FromHungry.Release();
                    }
                    else
                        goto check_1_1;
                }
                goto check_1;
            check_1_1:
 
                Global.Eat.WaitOne();
                Global.vhod_control = Global.vhod_control + 1;
                Console.WriteLine("Философ 1 ест");
                Thread.Sleep(1000);
                Global.vhod_control = Global.vhod_control - 1;
                Global.Eat.Release();
            }
        }
    }
 
    public class Philosopher_2
    {
        public static void Phil_2_eat()
        {
            while (true)
            {
                Global.Think.WaitOne();
                Console.WriteLine("Философ 2 размышляет");
                Thread.Sleep(1000);
                Global.Think.Release();
 
                Global.ToHungry.WaitOne();
                Console.WriteLine("Философ 2 голоден");
                Thread.Sleep(1000);
                Global.FromHungry.Release();
 
            check_2:
                {
                    if (Global.vhod_control == 2)
                    {
                        Global.ToHungry.WaitOne();
                        Console.WriteLine("Философ 2 голоден");
                        Thread.Sleep(1000);
                        Global.FromHungry.Release();
                    }
                    else
                        goto check_2_1;
                }
                goto check_2;
            check_2_1:
 
                Global.Eat.WaitOne();
                Global.vhod_control = Global.vhod_control + 1;
                Console.WriteLine("Философ 2 ест");
                Thread.Sleep(1000);
                Global.vhod_control = Global.vhod_control - 1;
                Global.Eat.Release();
            }
        }
    }
 
    public class Philosopher_3
    {
        public static void Phil_3_eat()
        {
            while (true)
            {
                Global.Think.WaitOne();
                Console.WriteLine("Философ 3 размышляет");
                Thread.Sleep(1000);
                Global.Think.Release();
 
                Global.ToHungry.WaitOne();
                Console.WriteLine("Философ 3 голоден");
                Thread.Sleep(1000);
                Global.FromHungry.Release();
 
            check_3:
                {
                    if (Global.vhod_control == 2)
                    {
                        Global.ToHungry.WaitOne();
                        Console.WriteLine("Философ 3 голоден");
                        Thread.Sleep(1000);
                        Global.FromHungry.Release();
                    }
                    else
                        goto check_3_1;
                }
                goto check_3;
            check_3_1:
 
                Global.Eat.WaitOne();
                Global.vhod_control = Global.vhod_control + 1;
                Console.WriteLine("Философ 3 ест");
                Thread.Sleep(1000);
                Global.vhod_control = Global.vhod_control - 1;
                Global.Eat.Release();
            }
        }
    }
 
    public class Philosopher_4
    {
        public static void Phil_4_eat()
        {
            while (true)
            {
                Global.Think.WaitOne();
                Console.WriteLine("Философ 4 размышляет");
                Thread.Sleep(1000);
                Global.Think.Release();
 
                Global.ToHungry.WaitOne();
                Console.WriteLine("Философ 4 голоден");
                Thread.Sleep(1000);
                Global.FromHungry.Release();
 
            check_4:
                {
                    if (Global.vhod_control == 2)
                    {
                        Global.ToHungry.WaitOne();
                        Console.WriteLine("Философ 4 голоден");
                        Thread.Sleep(1000);
                        Global.FromHungry.Release();
                    }
                    else
                        goto check_4_1;
                }
                goto check_4;
            check_4_1:
 
                Global.Eat.WaitOne();
                Global.vhod_control = Global.vhod_control + 1;
                Console.WriteLine("Философ 4 ест");
                Thread.Sleep(1000);
                Global.vhod_control = Global.vhod_control - 1;
                Global.Eat.Release();
            }
        }
    }
 
    public class Philosopher_5
    {
        public static void Phil_5_eat()
        {
            while (true)
            {
                Global.Think.WaitOne();
                Console.WriteLine("Философ 5 размышляет");
                Thread.Sleep(1000);
                Global.Think.Release();
 
                Global.ToHungry.WaitOne();
                Console.WriteLine("Философ 5 голоден");
                Thread.Sleep(1000);
                Global.FromHungry.Release();
 
            check_5:
                {
                    if (Global.vhod_control == 2)
                    {
                        Global.ToHungry.WaitOne();
                        Console.WriteLine("Философ 5 голоден");
                        Thread.Sleep(1000);
                        Global.FromHungry.Release();
                    }
                    else
                        goto check_5_1;
                }
                goto check_5;
            check_5_1:
 
                Global.Eat.WaitOne();
                Global.vhod_control = Global.vhod_control + 1;
                Console.WriteLine("Философ 5 ест");
                Thread.Sleep(1000);
                Global.vhod_control = Global.vhod_control - 1;
                Global.Eat.Release();
            }
        }
    }
 
    class Global
    {
        public static int vhod_control = 0;
        public static int s = 100;
        public static int t = 100;
        public static int n = 2;
        public static Semaphore Eat = new Semaphore(n, n);
        public static Semaphore FromThink = new Semaphore(0, s);
        public static Semaphore Think = new Semaphore(s, s);
        public static Semaphore FromHungry = new Semaphore(0, t);
        public static Semaphore ToHungry = new Semaphore(t, t);
 
        static void Main(string[] args)
        {
            Thread Thread_1 = new Thread(new ThreadStart(Philosopher_1.Phil_1_eat));
            Thread_1.Start();
 
            Thread Thread_2 = new Thread(new ThreadStart(Philosopher_2.Phil_2_eat));
            Thread_2.Start();
 
            Thread Thread_3 = new Thread(new ThreadStart(Philosopher_3.Phil_3_eat));
            Thread_3.Start();
 
            Thread Thread_4 = new Thread(new ThreadStart(Philosopher_4.Phil_4_eat));
            Thread_4.Start();
 
            Thread Thread_5 = new Thread(new ThreadStart(Philosopher_5.Phil_5_eat));
            Thread_5.Start();
        }
    }
}
Помогите переделать этот код из семафоров в 1) мониторы и 2) взаимоблокировки. И что-то тут надо выделить в модуль. Облазил многие книги и сайты в интернете - результат 0. Кому не сложно, прошу помочь в реализации этой задачи. Также просьба скинуть ваши исходники. Заранее благодарен
0
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 15
23.06.2010, 07:25  [ТС]
Вопрос еще не решен.
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
23.06.2010, 11:55
вот не большая реализация:
C#
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication2
{
    class Program
    {
        public static Semaphore s = new Semaphore(3, 3);
        static List<Fork> fork = new List<Fork>();
        static List<Philosopher> ph = new List<Philosopher>();
 
        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++)
                fork.Add(new Fork());
            for (int i = 0; i < 5; i++)
                ph.Add(new Philosopher((i + 1).ToString(), i));
 
            Thread t1 = new Thread(ph[0].Start);
            Thread t2 = new Thread(ph[1].Start);
            Thread t3 = new Thread(ph[2].Start);
            Thread t4 = new Thread(ph[3].Start);
            Thread t5 = new Thread(ph[4].Start);
 
            t1.Start(fork);
            t2.Start(fork);
            t3.Start(fork);
            t4.Start(fork);
            t5.Start(fork);
        }
    }
 
    public class Philosopher
    {
        bool isHunger = false;
        string philosopherName;
        int number;
        bool isDeath = false;
 
        public Philosopher(string Name, int number)
        {
            philosopherName = Name;
            this.number = number;
        }
 
        void GetFork(List<Fork> fork)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimer);
            timer.Interval = 2000;
            Console.WriteLine("Philosopher {0} waiting forks", philosopherName);
            timer.Start();
            Program.s.WaitOne();
            int first = number;
            int second = (number + 1) % (fork.Count - 1);
 
            if (!fork[first].IsUsing && !fork[second].IsUsing)
            {
                timer.Dispose();
                fork[first].IsUsing = true;
                fork[second].IsUsing = true;
                Console.WriteLine("Philosopher {0} eating.", philosopherName);
                Console.WriteLine("Forks with numbers {0} and {1} are using.", first + 1, second + 1);
                Thread.Sleep(1000);
                fork[first].IsUsing = false;
                fork[second].IsUsing = false;
            }
            Program.s.Release();
        }
 
        void OnTimer(object sender, System.Timers.ElapsedEventArgs e)
        {
            Console.BackgroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("AAAAAAAA!!!!!!!!!\n Philosopher {0} is death!!!!!!!! T_T", philosopherName);
            Console.ResetColor();
            isDeath = true;
        }
 
        public void Start(object obj)
        {
            while (true)
            {
                Thread.Sleep(2000 + number * 1000);
                ChangeStatus();
                if (isHunger)
                    GetFork((List<Fork>)obj);
                if (isDeath) break;
            }
        }
 
        void ChangeStatus()
        {
            isHunger = !isHunger;
            if (!isHunger)
                Console.WriteLine("Philosopher {0} thinking.", philosopherName);
        }
    }
 
    public class Fork
    {
        bool isUsing = false;
 
        public bool IsUsing 
        {
            get { return isUsing; }
            set { isUsing = value; }
        }
    }
}
Добавлено через 17 минут
Если баловаться с временем, то можно избежать смерти философов
1
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 15
23.06.2010, 13:18  [ТС]
kuroiryuu - спс Вам. Помогите еще пжлста написать программу с взаимоблокировками

Добавлено через 1 минуту
Цитата Сообщение от kuroiryuu Посмотреть сообщение
вот не большая реализация:
C#
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication2
{
    class Program
    {
        public static Semaphore s = new Semaphore(3, 3);
        static List<Fork> fork = new List<Fork>();
        static List<Philosopher> ph = new List<Philosopher>();
 
        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++)
                fork.Add(new Fork());
            for (int i = 0; i < 5; i++)
                ph.Add(new Philosopher((i + 1).ToString(), i));
 
            Thread t1 = new Thread(ph[0].Start);
            Thread t2 = new Thread(ph[1].Start);
            Thread t3 = new Thread(ph[2].Start);
            Thread t4 = new Thread(ph[3].Start);
            Thread t5 = new Thread(ph[4].Start);
 
            t1.Start(fork);
            t2.Start(fork);
            t3.Start(fork);
            t4.Start(fork);
            t5.Start(fork);
        }
    }
 
    public class Philosopher
    {
        bool isHunger = false;
        string philosopherName;
        int number;
        bool isDeath = false;
 
        public Philosopher(string Name, int number)
        {
            philosopherName = Name;
            this.number = number;
        }
 
        void GetFork(List<Fork> fork)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimer);
            timer.Interval = 2000;
            Console.WriteLine("Philosopher {0} waiting forks", philosopherName);
            timer.Start();
            Program.s.WaitOne();
            int first = number;
            int second = (number + 1) % (fork.Count - 1);
 
            if (!fork[first].IsUsing && !fork[second].IsUsing)
            {
                timer.Dispose();
                fork[first].IsUsing = true;
                fork[second].IsUsing = true;
                Console.WriteLine("Philosopher {0} eating.", philosopherName);
                Console.WriteLine("Forks with numbers {0} and {1} are using.", first + 1, second + 1);
                Thread.Sleep(1000);
                fork[first].IsUsing = false;
                fork[second].IsUsing = false;
            }
            Program.s.Release();
        }
 
        void OnTimer(object sender, System.Timers.ElapsedEventArgs e)
        {
            Console.BackgroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("AAAAAAAA!!!!!!!!!\n Philosopher {0} is death!!!!!!!! T_T", philosopherName);
            Console.ResetColor();
            isDeath = true;
        }
 
        public void Start(object obj)
        {
            while (true)
            {
                Thread.Sleep(2000 + number * 1000);
                ChangeStatus();
                if (isHunger)
                    GetFork((List<Fork>)obj);
                if (isDeath) break;
            }
        }
 
        void ChangeStatus()
        {
            isHunger = !isHunger;
            if (!isHunger)
                Console.WriteLine("Philosopher {0} thinking.", philosopherName);
        }
    }
 
    public class Fork
    {
        bool isUsing = false;
 
        public bool IsUsing 
        {
            get { return isUsing; }
            set { isUsing = value; }
        }
    }
}
Добавлено через 17 минут
Если баловаться с временем, то можно избежать смерти философов

я так полагаю это написано с помощью монитора?
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
23.06.2010, 13:53
с помощью семафора вообще-то
0
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 15
23.06.2010, 13:54  [ТС]
Цитата Сообщение от kuroiryuu Посмотреть сообщение
с помощью семафора вообще-то
а то что с меня был код - в нем проблемы какие-то?
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
23.06.2010, 14:05
с использованием Monitor
описал те методы, которые изменились:
C#
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
public class Philosopher
    {
        //..............................
 
        void GetFork(List<Fork> fork)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimer);
            timer.Interval = 3000;
            Console.WriteLine("Philosopher {0} waiting forks", philosopherName);
            timer.Start();
            Monitor.Enter(fork);
            try
            {
                if (isDeath)
                    return;
                int first = number;
                int second = (number == fork.Count - 1) ? 0 : number + 1;
                if (!fork[first].IsUsing && !fork[second].IsUsing)
                {
                    Console.WriteLine("Philosopher {0} getting forks ({1})", philosopherName, timer.Enabled);
                    timer.Stop();
                    timer.Dispose();
                    fork[first].IsUsing = true;
                    fork[second].IsUsing = true;
                    Console.WriteLine("Philosopher {0} eating.", philosopherName);
                    Console.WriteLine("Forks with numbers {0} and {1} are using.", first + 1, second + 1);
                    Thread.Sleep(250);
                    fork[first].IsUsing = false;
                    fork[second].IsUsing = false;
                }
            }
            finally
            {
                Monitor.Exit(fork);
            }
        }
 
        void OnTimer(object sender, System.Timers.ElapsedEventArgs e)
        {
            Console.BackgroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("AAAAAAAA!!!!!!!!!\n Philosopher {0} is death!!!!!!!! T_T", philosopherName);
            Console.ResetColor();
            isDeath = true;
            ((System.Timers.Timer)sender).Stop();            
        }
 
        public void Start(object obj)
        {
            while (true)
            {
                Thread.Sleep(2000 + number * 1000);
                ChangeStatus();
                if (isHunger)
                    GetFork((List<Fork>)obj);
                if (isDeath)
                {
                    return;
                }
            }
        }
        //...........................
    }
Добавлено через 4 минуты
Цитата Сообщение от Djul Посмотреть сообщение
а то что с меня был код - в нем проблемы какие-то?
если он работал, но проблем не было, т.к. я его не смотрел
просто написал свою версию
0
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 15
23.06.2010, 14:07  [ТС]
я в этом не особо разбираю, но что-то про Folk описывалось в теме про мониторы, или я что-то путаю?
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
23.06.2010, 14:12
Цитата Сообщение от Djul Посмотреть сообщение
я в этом не особо разбираю, но что-то про Folk описывалось в теме про мониторы, или я что-то путаю?
не совсем понимаю про какую тему идёт речь
у меня класс Fork (вилка), а не Folk (люди)
а Fork у меня общий ресурс для философов, то вот за него и дерутся они
0
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 15
23.06.2010, 14:16  [ТС]
Не затруднит ли Вас скинуть исходник?

Добавлено через 2 минуты
И еще мне бы не помешала бы эта тема про философов с помощью монитора и самоблокировки - но не знаю как реализовать это. Кто может подсказать как переделать код семафора? и подскажите как сделать модуль этой программы - типа основная часть программы должна быть в отдельном файле
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
23.06.2010, 14:31
не затруднит
C#
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication2
{
    class Program
    {
        static List<Fork> fork = new List<Fork>();
        static List<Philosopher> ph = new List<Philosopher>();
 
        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++)
                fork.Add(new Fork());
            for (int i = 0; i < 5; i++)
                ph.Add(new Philosopher((i + 1).ToString(), i));
 
            Thread t1 = new Thread(ph[0].Start);
            Thread t2 = new Thread(ph[1].Start);
            Thread t3 = new Thread(ph[2].Start);
            Thread t4 = new Thread(ph[3].Start);
            Thread t5 = new Thread(ph[4].Start);
 
            t1.Start(fork);
            t2.Start(fork);
            t3.Start(fork);
            t4.Start(fork);
            t5.Start(fork);
        }
    }
 
    public class Philosopher
    {
        bool isHunger = false;
        string philosopherName;
        int number;
        bool isDeath = false;
 
        public Philosopher(string Name, int number)
        {
            philosopherName = Name;
            this.number = number;
        }
 
        void GetFork(List<Fork> fork)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimer);
            timer.Interval = 3000;
            Console.WriteLine("Philosopher {0} waiting forks", philosopherName);
            timer.Start();
            Monitor.Enter(fork);
            try
            {
                if (isDeath)
                    return;
                int first = number;
                int second = (number == fork.Count - 1) ? 0 : number + 1;
                if (!fork[first].IsUsing && !fork[second].IsUsing)
                {
                    Console.WriteLine("Philosopher {0} getting forks ({1})", philosopherName, timer.Enabled);
                    timer.Stop();
                    timer.Dispose();
                    fork[first].IsUsing = true;
                    fork[second].IsUsing = true;
                    Console.WriteLine("Philosopher {0} eating.", philosopherName);
                    Console.WriteLine("Forks with numbers {0} and {1} are using.", first + 1, second + 1);
                    Thread.Sleep(250);
                    fork[first].IsUsing = false;
                    fork[second].IsUsing = false;
                }
            }
            finally
            {
                Monitor.Exit(fork);
            }
        }
 
        void OnTimer(object sender, System.Timers.ElapsedEventArgs e)
        {
            Console.BackgroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("AAAAAAAA!!!!!!!!!\n Philosopher {0} is death!!!!!!!! T_T", philosopherName);
            Console.ResetColor();
            isDeath = true;
            ((System.Timers.Timer)sender).Stop();            
        }
 
        public void Start(object obj)
        {
            while (true)
            {
                Thread.Sleep(2000 + number * 1000);
                ChangeStatus();
                if (isHunger)
                    GetFork((List<Fork>)obj);
                if (isDeath)
                {
                    return;
                }
            }
        }
 
        void ChangeStatus()
        {
            isHunger = !isHunger;
            if (!isHunger)
                Console.WriteLine("Philosopher {0} thinking.", philosopherName);
        }
    }
 
    public class Fork
    {
        bool isUsing = false;
 
        public bool IsUsing 
        {
            get { return isUsing; }
            set { isUsing = value; }
        }
    }
}
вот весь исходник
0
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 15
23.06.2010, 14:36  [ТС]
Имел введу архив программы, на чем Вы делали.

"Philosopher {0} is death!!!!!!!! T_T" - в смысле: философ размышляет (голоден!)?))) или как?)
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
23.06.2010, 14:40
если интересно про потоки почитать, то можете посмотреть статью на rsdn.ru

Добавлено через 2 минуты
Цитата Сообщение от Djul Посмотреть сообщение
"Philosopher {0} is death!!!!!!!! T_T" - в смысле: философ размышляет (голоден!)?))) или как?)
в смысле не дождался своих вилок
делал на VS 2008, хотя дожно работать и на 2005, если удалить строку using System.Linq;
Вложения
Тип файла: zip ConsoleApplication.zip (6.4 Кб, 121 просмотров)
0
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 15
23.06.2010, 14:41  [ТС]
Цитата Сообщение от kuroiryuu Посмотреть сообщение
если интересно про потоки почитать, то можете посмотреть статью на rsdn.ru

Добавлено через 2 минуты

в смысле не дождался своих вилок
делал на VS 2008, хотя дожно работать и на 2005, если удалить строку using System.Linq;
Благодарю за помощь!
Осталось немногое теперь))
0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
23.06.2010, 15:13
перезаписываю более свежую версию исходника
Вложения
Тип файла: zip ConsoleApplication.zip (6.4 Кб, 250 просмотров)
0
0 / 0 / 0
Регистрация: 19.06.2010
Сообщений: 15
23.06.2010, 15:16  [ТС]
Цитата Сообщение от kuroiryuu Посмотреть сообщение
перезаписываю более свежую версию исходника
А для чего Вы ввели еще 1 философа? по заданию их 5, а тут стало 6
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.06.2010, 15:16
Помогаю со студенческими работами здесь

Обедающие философы
Добрый вечер! Возник такой вот вопрос: Есть стандартная задача с обедающими философами, описанная в книге Таненбаума. Но...

Процессы, Обедающие философы
Здравствуйте! Нужна помощь с задачей о обедающих философах сделанная не на потоках как здесь...

Обедающие философы, Critical Section
Задача: Есть 5 философов. В столовой расположен круглый стол, вокруг которого расставлены 5 стульев. На столе находится одна большая...

Обедающие философы, уменьшить возможность возникновения deadlock-а
Есть программа, которая решает задачу обедающих философов.public class Phil { int pos; Fork left; Fork right; int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru