|
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
|
|||||||||||
Задача о философах с использованием событий11.03.2014, 00:58. Показов 4127. Ответов 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() Написать код с использованием событий и делегатов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|