![]() |
Цитата:
Скрытый текст
Postman: Надо кошку завести, она будет всех радовать!
Механик: Это бесполезное животное будет от меня получать пендаля Postman: Ну это будет же тебя радовать? Механик: Да.... Postman: Значит ее жизнь не будет бессмысленной. (с)башорг |
Цитата:
|
Цитата:
|
Цитата:
http://s004.radikal.ru/i206/1308/43/a1b6ed31ee96.gif |
kravets, проблема рандомизации доступа к ресурсу с использованием мьютекса решилась.
В классике каждый поток перед доступом к ресурсу пытается захватить мьютекс и если не получается уходит в спячку, пока мьютекс не освободится и система отдаст мьютекс потоку. Код:
if WaitForSingleObject(ResMutex,INFINITE) = WAIT_OBJECT_0 then Система отслеживает время непрерывного ожидания и при освобождении мьютекса выбирает тот поток, который дольше всех ждал (при равных приоритетах). А нам нужен случайный выбор. Ну так давайте спутаем все карты системе и будем ждать не непрерывно, а случайно-дискретно. Код:
flag:= False; Минус метода - низкое быстродействие, но мне и не нужно быстро. Потоки в среднем раз в секунду обращаются к ресурсу. По сути получилась спин-блокировка с ожиданиями в течение случайных dt. Протестировал в имитационной модели. Статистические показатели отлично сходятся с расчетными. |
Цитата:
|
kravets, нет, не то же самое. Шаманство с приоритетами косвенно влияет на остальные потоки,
которые никакого отношения к доступу ресурсу и вообще к процессу моделирования не имеют. |
Цитата:
|
kravets, вмешательства в моделирование нет, среднее время ожидания доступа к ресурсу
не изменилось. Изменился лишь порядок захвата ресурса - он стал случайным, а не спра- ведливым, как это реализовано в винде. И это как раз то, что и требовалось. Изменение приоритетов - внесение искусственной асимметрии совершенно несвойственной модели. То что делаю я имеет следующую аналогию. Ожидание какого-либо события с поглядыва- нием на часы через случайные интервалы времени. Можно вообще не смотреть на часы и просто ждать, а можно поглядывать - на событие и на всех остальных это никак не влияет. |
Цитата:
|
kravets, я никак не управляю временем. Оно и правда тикает снаружи, аппаратно.
Все моделируемые объекты живут в реальном непрерывном времени. Дискретны и случайны только временные метки, кот. ставятся исключительно только для ОС, чтобы она выбирала на основе времени ожидания с момента последней случайной метки ожидающего объекта, а не с момента, когда понадобился ресурс. И главное, дискретные метки не мешают захватить ресурс в любой момент между метками. |
Цитата:
|
kravets, стандартная функция ожидания объекта синхронизации (мьютекса в моем случае).
Во время ожидания процессорное время не тратится, поток отправляется системой в спячку до того момента, когда либо мьютекс освободится, либо истечет таймаут dt. За мьютексом и за таймаутом следит ОС, и программист при всем желании никак вмешаться в это не может. Пока не произошло ни то, ни другое, ОС предоставляет процессорное время другим потокам. Средняя загрузка процессора потоками, участвующих в процессе моделировании, менее 1%. А все потому что даже когда поток захватывает мьютекс и получает доступ к ресурсу, он не тратит процессорное время, а просто вызывает функцию Sleep с заданным таймаутом, ими- тируя некоторые действия с ресурсом с некоторой длительностью, а реально просто спит, мьютекс при этом захвачен этим потоком, а остальные потоки спят, сидя в Wait-функции. Короче, все потоки практически всё время "спят", включая поток, захвативший мьютекс. |
все. баста. на сегодня мне хватит (дров)
щас кину курицу в духовку, накопаю картошки с морковкой, помою посуду после обеда, сдерну с веревки шмотки высушенные и буду отдыхать по поводу воскресенья. (сяду и буду делать бумажную работу ибо ножки подо мной уже подгибаются). |
Цитата:
|
Текущее время: 14:58. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
© 2001—2025, «Аспирантура. Портал аспирантов»