|
|
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
За круглым столом сидит 6 философов, перед каждым тарелка с едой, по сторонам у каждого философа вилка и нож, всего 3 ножа и 3 вилки. То есть последовательность - философ-вилка-философ-нож-философ-вилка- и т.д. Что бы поесть философ должен взять вилку и нож в руки, если нет вилки или ножа, философ ждет недостающий прибор, поев философ освобождает приборы. Проблема в понимании как это сделать в принципе. Я так понимаю должна быть сущность философ, у которого должны быть правая и левая рука, так, как вилка-нож идут по очереди, не важно, что он берет, важно взять что-то в руку. Потому наверное руки лучше сделать буллеановой переменной, занята или пустая. Если обе заняты - едим, если одна пустая, пытаемся в нее взять прибор по раз в какое-то время. Не понятно, как сделать круглый стол с приборами, рассадив туда философов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 12:49 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
Покуда ходил в магазин, придумал такое. Есть обьект стол, у которого есть поля вилка1, вилка2, вилка3 и нож1, нож2, нож3 - буллеановские, показывающие доступность прибора. Создаем обьекты философ, и каждому назначаем его пару приборов, каждого философа запускаем в отдельном потоке, и философ пытается взять один прибор, второй прибор, потом делается проверка, если оба прибора доступны, он начинает обедать, если оба прибора недоступны, то запускается таймаут и попытка повторяется, если один прибор не доступен, то запускается функциия которая по таймауту пытается взять нужный прибор. Когда оба прибора взяты, он начинает кушать. Я с потоками больше, чем просто запустить по клику выполнение цикла в отдельном потоке не сталкивался, какие могут быть подводные камни, о чем прежде всего почитать? И вопрос хватит ли буллеановых полей, или надо создавать обьекты вилка и нож, и работать с ними? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 13:23 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
liberumНе понятно, как сделать круглый стол с приборами, рассадив туда философов. Преамбула. Главное достоинство объектной модели - интуитивно понятная логика переходящая от модели реального мира. Главный недостаток - неоднозначность перехода. Усугубляется еще и тем, что в зависимости от того, как модель реального мира будет представлена в объектной модели зависит то, какие алгоритмы можно будет применять для решения поставленной задачи и их сложность. Да и люди мыслят не тривиально, поэтому простое и очевидное для одного - темный лес для другого и наоборот. :) Собственно ответ. Философ это детерминированный автомат с признаком состояния голоден/сыт (собственно цель накормить всех). Двумя слотами (нож и вилка). (соответственно 4 состояния от пусто-пусто до занято-занято, последнее состояние и меняет первый признак). И ссылки на двух соседей (право-лево). Ну и правила передачи предметов (только из полного в пустой). Два одновременно передавать третьему одинаковый предмет не могут. P.S. Главный интерес в игре - вызвать deadlock, понять почему. Добиться чтоб не вызывался и перейти к следующему. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 13:43 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, спасибо, как я понимаю, должно быть что-то типа кольцевого связного списка? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ну и реализация остальных методов.. Если я мыслю в правильном направлении, то как инициировать? Я работал со связным списком без потоков, понимаю, как он работает, а что меняется для запуска каждой ноды в отдельном потоке? Как получать доступ к нодам в других потоках? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 16:11 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
Я пока что на первой строчке остановился, судя по описанию, последовательность должна быть, к примеру, философ-вилка-нож-философ-вилка-нож-... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 17:25 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
Паша01Я пока что на первой строчке остановился, судя по описанию, последовательность должна быть, к примеру, философ-вилка-нож-философ-вилка-нож-... нет, так каждому философу будет по прибору и задача потеряет смысл, задача в том, что бы на 3 пары приборов поели 6 человек, в классической задаче 1 вилка, и потому все обращаются по таймауту к одному предмету в случайном диапазоне времени, а в моем случаи одна часть прибора справа и вторая слева. вот схематично нарисовал https://i.gyazo.com/d94e44fbec76c5780cc742c80db62198.png ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 18:17 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
liberum, ты все напутал. В классической постановке задача моделировала дедлок при условии что все 5 филосов берут вилки с лева направо. Решение дедлока - смена порядка рук. 2 из трех философоф меняют руки и проблема решена. Но ты зачем-то ввел еще и нож (непонятно что это дает кроме запутывания читателя). Кроме того ты пишешь что в классической задаче - 1 вилка - это НЕПРАВДА. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 18:55 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
maytonliberum, ты все напутал. В классической постановке задача моделировала дедлок при условии что все 5 филосов берут вилки с лева направо. Решение дедлока - смена порядка рук. 2 из трех философоф меняют руки и проблема решена. Но ты зачем-то ввел еще и нож (непонятно что это дает кроме запутывания читателя). Кроме того ты пишешь что в классической задаче - 1 вилка - это НЕПРАВДА. Возможно я не прав в плане классической задачи, но моя нарисована на рисунке, там не одна вилка а вилка и нож, что бы поесть надо 2 взять и нож и вилку. если у тебя только нож, надо ждать вилку, возможен вариант, что у всех будет или нож или вилка, и цикл замкнется, это не исключается. В целом задача более глобально, поесть надо несколько раз, со временем хочется есть снова, характер у разных философов разный, одни берут один прибор и ждут пока не появится второй, другие если нет второго прибора, первый кладут на место, и через время пробуют снова.. Но у меня сейчас проблема в понимании стола, выше вариант где стола нет, а идет проверка только на наличие у соседа прибора, но тут надо как то надо создать в разных потоках и взаимодействовать между ними, читаю сейчас о работе с потоками статьи.. пока не придумал как сделать.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 19:10 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
liberum, убери стол вообще из рассуждений. Он тебя путает. Философ - thread. Вилка - мутекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 20:43 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
Три философа пусть набивают брюхо. Надо пристроить ещё троих. Один пусть займётся решением этой задачи. Второго послать в магазин за недостающими ножами-вилками (и стаканами, естественно). Последнего послать в магазин за бутылками. И ничего программировать не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 20:50 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
На то они и философы. Будь это обедающие гангстеры - нам бы пришлось вводить в задачу ножи и Tommy-Guns. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 21:02 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
maytonliberum, убери стол вообще из рассуждений. Он тебя путает. Философ - thread. Вилка - мутекс. Спасибо.. Получается, нужно создать класс философов, реализующий Runnable, потом класс где будет synchronized метод вилок и класс где будет synchronized метод ножей, потом в мейне создать 6 экземпляров философов, 3 экземпляра вилок, 3 экземпляра ножей, раздать из расчета 1 вилка и 1 нож на каждые два философа и смотреть кто когда поест.. Я правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 00:47 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
liberum, пиши код. Слова ничего не значат. Иначе мы еще пару недель будем обсуждать свойства ножей в отличие от вилок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 01:18 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
авторliberum, пиши код. Слова ничего не значат. Как-то так.. Код: 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. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: 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. Теперь попробую сделать остальную часть задачи, надеюсь дальше будет проще для понимания.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 07:59 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
khine - это нож на каком языке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 08:53 |
|
||
|
Новая постановка старой задачи с обедающими философами
|
|||
|---|---|---|---|
|
#18+
XDiaBLokhine - это нож на каком языке? Затупил, весь день читал потоки вчера, в голове каша :) Но дальнейшее развитие.. Наш философ претерпел некоторые изменения, теперь он начал кушать и поправляться.. И периодически думать, пока не занят едой :D Собственно код: Код: 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. У кода большой минус, во время активных размышлений философ не тратит силы.. А должен.. Каким-то образом, раз в секунду он должен терять 10 НР.. Я так понимаю, это поток внутри потока, и из того, что я читал вчера, это должен быть демон поток. Если философ умирает (0 НР), то поток прекращается. На этот случай я видел ставят буллеановскую переменную, которую проверяют в while(true), и при смене значения этой переменной, завершают поток. И еще вопрос, если вдруг все философы будут сыты, 100 НР у каждого, то надо завершить потоки, собственно вопрос, это должен быть еще один класс, в котором и надо хранить НР философов, сами философы будут туда скидывать +10НР или -10НР, а там будет бегать бесконечный цикл, который вернет false всем, если у всех НР 100, или вернет false одному, если у него НР 0. Или это решается как то проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 09:29 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39296456&tid=2123782]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 397ms |

| 0 / 0 |
