|
0 / 0 / 0
Регистрация: 25.09.2017
Сообщений: 1
|
||||||
Работа с потоками25.09.2017, 16:33. Показов 932. Ответов 1
Метки нет (Все метки)
Добрый день, уже третий день бьюсь над одной задачей:
Имеется группа из N студентов, в начале ленты они договариваются между собой в каком порядке будут защищать лабораторные работы преподавателю. Не сдавший студент идет в конец очереди. Каждый студент защищает лабораторную какое-то время, а также с какой-то вероятностью (равномерный закон распределения) положительного или отрицательного результата. Описанный процесс происходит бесконечно. Значение N также задается пользователем при старте процесса. В конце вывести список студентов, с пометкой «защитил»/«не защитил», сколько было попыток. Как раз сейчас изучаются мьютексы и семафоры. По формулировке задания все можно было реализовать чисто под join-ы (ожидание завершения потока). Однако поговорив с преподавателем пришли к небольшой оговорке: студенты идут толпой, но сдают по одному. То есть у меня должны быть запущены ВСЕ потоки и уже если поток "студент" не сдаст, то он идет в конец списка, а далее идет следующий поток. В связи с этим возникло несколько проблем: 1)Если не ждать завершения потока (join), то при запуске всех потоков они будут в разном порядке обращаться к функции, из-за чего потом невозможно точно простроить очередность запущенных потоков. При разных запусках - разные запущенные потоки. 2)Пробовал реализовать через рекурсивную функцию: поток запускает функцию, и если в ней получает значение "Не сдал", то в конце функции запускает еще один поток. При таком способе у меня запущенные в потоке функции уходили в конец списка, но при передаче значении они становились некорректными (например, номер студента при обычном запуске 1, а при запуске потока из потока: 2252542). Поэтому этот способ я тоже отбросил. 3)Решил пойти уже третьим способом и просто сделать бесконечный цикл, в котором он запускает потоки и если поток получает значение "Не сдал", то он при повторном прохождении цикла запускает еще раз поток с этими же значениями. Но и тут свои подводные камни: если цикл проходил и начинался заново, а в это время поток не успел изменить свое значение, то он запустит поток снова, из-за чего корректность значений опять падает. Из-за этого пришлось ставить таймеры, но с ними, получается, что я опять вернулся к самому первому варианту с join-ами, а мне надо чтобы ВСЕ потоки были запущены!!! Помоги выйти из положения, скажите, возможно ли запускать несколько потоков и контролировать их очередность??? Вот моя последняя версия кода:
0
|
||||||
| 25.09.2017, 16:33 | |
|
Ответы с готовыми решениями:
1
Работа с потоками
Переделать задачу с потоками на fork |
|
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
|
|
| 25.09.2017, 22:49 | |
|
Напрашивается схема, когда главный поток (который выполняет main) является преподавателем, который может контролировать через дополнительный мьютекс попадание студента на экзамен. Он же, преподаватель, может давать результат вероятностной функции результата сдачи. Вам нужно сначала создать группу студентов в отдельном цикле, потом в другом цикле "провести экзамен" до тех пор, пока все студенты не сдадут. Третий цикл "пересдач" уже будет не нужен.
0
|
|
| 25.09.2017, 22:49 | |
|
Помогаю со студенческими работами здесь
2
TCP/IP сервер - клиент - как работать с потоками? Один элемент в списке обрабатывается двумя потоками Передача файла между потоками поблочно с помощью пайпов Базовые операции с параллельными потоками операционной системы Linux Базовые операции с параллельными потоками операционной системы Linux 2 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
|
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|