|
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
|
|||||||||||
Задача о философах с использованием событий11.03.2014, 00:58. Показов 4086. Ответов 13
Метки нет (Все метки)
Пытаюсь разобраться с этой задачей .
Задача: за круглым столом сидят философы. Их жизненный цикл состоит из двух состояний: ест и думает. Ест он двумя вилками - правой и левой, а вилки расположены не каждому по две, а между каждыми двумя философами по одной. Когда один ест - вилки вокруг него блокируются событиями, а если хотя бы одна из вилок занята - он просто забивает на еду и начинает думать. Поискал в интернете и нашёл такой пример:
Вроде всё более менее понятно , кроме пару моментов: каким образом задаются значения левой и правой вилки ? написано -
0
|
|||||||||||
| 11.03.2014, 00:58 | |
|
Ответы с готовыми решениями:
13
Задача о философах Задача об обедающих философах Задача об обедающих философах |
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
| 11.03.2014, 01:11 | ||||||
|
Чтоб было более понятно:
Добавлено через 4 минуты Так же нужно использовать WaitForMultipleObjects в условии.
1
|
||||||
|
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
|
|
| 11.03.2014, 01:25 [ТС] | |
|
Спасибо, понял , просто запутано написано было
Да это я тоже заметил , и как раз после обращения к some[ 5 ] вылетает эксепшн может есть какой-то выход из этой ситуации ? может можно поставить какой-то ограничитель ? Добавлено через 11 минут а зачем WaitForMultipleObjects ? я когда изучал события , там использовалось WaitForSingleObject прочитал про WaitForMultipleObjects - вообще не пойму , какие ему параметры передавать нужно DWORD WaitForMultipleObjects( DWORD nCount, // число объектов в массиве lpHandles CONST HANDLE *lpHandles, // указатель на массив описателей объектов ядра BOOL bWaitAll, // флаг, означающей надо ли дожидаться всех объектов или достаточно одного DWORD dwMilliseconds // таймаут );
0
|
|
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
| 11.03.2014, 01:35 | ||||||
|
Просто у последнего потока должно быть some[ 4 ] для левой вилки, и some[ 0 ] для правой. Лучше передавай в качестве аргумента структуру с параметрами:
1
|
||||||
|
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
|
||||||||||||||||
| 11.03.2014, 01:49 [ТС] | ||||||||||||||||
|
Да я просто пока только начинаю всё это учить , может какие-то моменты не могу понять, хотя пытаюсь )
можете помочь , и объяснить , что к чему , пожалуйста ? если я сейчас начну туда ещё и структуру лепить , то вообще запутаюсь ) Добавлено через 8 минут я так понял , что в
и в мейне будет :
0
|
||||||||||||||||
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
| 11.03.2014, 02:10 | ||||||
Сообщение было отмечено NNN7 как решение
Решение
Добавлено через 1 минуту NNN7, да, вы правильно все поняли. Только вот в примере каша, прототип функции не соответствует ожидаемому в качестве параметра. Добавлено через 4 минуты WaitForMultipleObjects( PHILOSOPHERS_NUM, philosophers, true, INFINITE ); нужен для того, что бы основной поток дождался завершения всех дочерних потоков. Первым параметром идет количество объектов в массиве, вторым идет указатель на массив объектов, третьим - флаг - ждать ли сигнала от всех объектов ( true ) или хватит одного сигнала ( false ). Ну и последним - количество миллисекунд для ожидания. Вот, кстати, очень хорошая статья о многопоточности в целом, и о ней же в Windows в частности http://www.kurzenkov.com/artic... ding1.html
1
|
||||||
|
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
|
|||||||||||
| 11.03.2014, 02:23 [ТС] | |||||||||||
|
Спасибо большое . Правда я сейчас сразу так и не разберусь , много непонятного
извините , не пойму , что это означает :
я , наверное , Вас , уже достал) Добавлено через 8 минут ну да , в выводе , получается , что только 1 из философ действует а почему пишут все потоки ?
0
|
|||||||||||
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|||
| 11.03.2014, 02:29 | |||
|
HANDLE forks[ PHILOSOPHERS_NUM ] - это массив дескрипторов объектов события, ранее он назывался some[]. Я его переименовал и убрал в основную функцию из глобально области.
HANDLE philosophers[ PHILOSOPHERS_NUM ] - это массив дескрипторов потоков, ранее он назывался Philosopher[], я его так же переименовал и перенес в основную функцию из глобально области. const unsigned int PHILOSOPHERS_NUM - это количество философов. Ранее это был define и назывался kol, я просто переименовал, и сделал его константой переменной. Количество вилок совпадает с количество философов по условию. Фигурные скобки нужны для того, что бы элементы массива инициализировались нулями. Иначе там был бы мусор, будет работать и без этого, просто это предосторожность. В структуре forks[ 2 ] - это массив для объектов события, для левой и правой вилок. Сделал массивом для того, чтобы легче было передавать в WaitForMultipleObjects. .Добавлено через 2 минуты
0
|
|||
|
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
|
|
| 11.03.2014, 02:58 [ТС] | |
|
Спасибо! Не думал , что Вы так распишите
Буду пробовать осмысливать всё дальше) Спасибо Вам ещё раз!
0
|
|
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
| 11.03.2014, 03:27 | ||||||
|
Кстати, я тут ошибку сделал, именно поэтому вы видите, что только 1 из философов действует.
Так же сделал что бы не перемешивался вывод:
1
|
||||||
|
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
|
|||||||||||
| 11.03.2014, 11:19 [ТС] | |||||||||||
|
Спасибо!
Можете объяснить , что и как ? Я так понял , ввели ещё и критические секции
Добавлено через 1 час 9 минут и вот здесь запутался уже
0
|
|||||||||||
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|||||||
| 11.03.2014, 12:13 | |||||||
|
Я на быструю руку написал 3 функции потому что используются 3 printf с разным количеством параметров. Они просто для удобства. Можно было прям в функции потока обернуть все printf в
args.philosopherNum - это номер философа ( потока ). Или что то другое?
0
|
|||||||
|
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
|
|
| 11.03.2014, 15:40 [ТС] | |
|
а почему разное кол-во параметров? вроде ж для всех философов одинаково всё
и задача , получается , использует и события , и критические секции Добавлено через 3 часа 16 минут а можно ли как-то без критических секций?
0
|
|
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
| 12.03.2014, 11:18 | |
|
Конечно, можно. Я добавил ее для того, что бы вывод не перемешивался. Уберите ее, будет все работать точно также, но вывод будет перемешан.
0
|
|
| 12.03.2014, 11:18 | |
|
Помогаю со студенческими работами здесь
14
Многопоточность, задача об обедающих философах (семафоры) Задача об обедающих философах [C++|Linux|ARM Mitel5000] Правильная обработка событий с использованием .on() Написать код с использованием событий и делегатов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|