Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / AutoResetEvent vs Monitor / 25 сообщений из 89, страница 1 из 4
02.07.2018, 23:18
    #39668551
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
Вроде по всем докам Monitor должен работать быстрее, но у меня получается наоборот. Или я что то пропустил?
...
Рейтинг: 0 / 0
03.07.2018, 06:13
    #39668565
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
ViPRosВроде по всем докам Monitor должен работать быстрее, но у меня получается наоборот.
Анекдот про сферического коня в вакууме процитировать?
Монитор - это аналог critical section, и существует внутри одного процесса. AutoResetEvent и ManualResetEvent видны в разных процессах, что влечет за собой некоторый оверхед в реализации. Ну, и плюс специфика использования тех и других несколько разная. Вне контекста задачи говорить о предпочтительности использования того или другого бессмысленно.
...
Рейтинг: 0 / 0
03.07.2018, 09:27
    #39668606
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
Сон Веры Павловны,

Безотносительно коней ты тоже сказал что есть оверхед для WaitHandle, чего я не наблюдаю почему то.

А задача такая:
Имеются - {m} работ, {n} ресурсов.
Каждая работа может потребовать некоторое подмножество ресурсов из {n}.
Каждая работа добавляет в {m} новые работы и меняет состояние ресурсов из {n}.
Работа может окончиться неуспешно и вернуться в {m}.

Надо организовать конкурентный доступ к {n} для {m}.
...
Рейтинг: 0 / 0
03.07.2018, 09:38
    #39668608
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
На самом деле зависит от задачи. Event медленнее, но критические секции (Monitor) - это спинлок плюс Event. Т.е. делается N попыток блокировки в цикле, затем при неудаче засыпание на Event.

Если блокировки обычно нет, то Monitor быстрее, если наоборот и все ядра проца загружены, т.е. обычно заблокировано, то медленнее, т.к. впустую тратится процессорное время на спинлок.
...
Рейтинг: 0 / 0
03.07.2018, 10:34
    #39668634
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
Dima T,

где то прочитал, что есть ограничение на количество AutoResetEvents (64), не сталкивался ( я не вижу реакции)?
...
Рейтинг: 0 / 0
03.07.2018, 10:48
    #39668645
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
ViPRosDima T,

где то прочитал, что есть ограничение на количество AutoResetEvents (64), не сталкивался ( я не вижу реакции)?
AutoResetEvents это обертка над виндовым Event , для него нет ограничений по количеству.

Есть ограничение 64 для вызова WaitAll() или WaitAny() потому что внутри виндовая WaitForMultipleObjects() и это ее ограничение.

Для Monitor ничего подобного WaitAll()/WaitAny() вообще нет.
...
Рейтинг: 0 / 0
03.07.2018, 11:00
    #39668655
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
Dima T,

хреново что 64, у меня объектов может быть больше намного
...
Рейтинг: 0 / 0
03.07.2018, 11:01
    #39668657
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
ViPRosВроде по всем докам Monitor должен работать быстрее, но у меня получается наоборот. Или я что то пропустил?

Это по каким докам?
...
Рейтинг: 0 / 0
03.07.2018, 11:08
    #39668660
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
ViPRos,

Если у тебя преимущественно больше чтения, чем записи, можешь посмотреть в сторону ReaderWriterLockSlim.
...
Рейтинг: 0 / 0
03.07.2018, 11:23
    #39668670
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
hVosttViPRosВроде по всем докам Monitor должен работать быстрее, но у меня получается наоборот. Или я что то пропустил?

Это по каким докам?
MSDN пишет что Monitor эффективнее

Мониторы и дескрипторы ожидания

Важно отметить различия между использованием объектов Monitor класса и WaitHandle объектов.
Monitor Класс полностью управляемые и полностью переносимые, а также могут оказаться эффективными в плане использования ресурсов операционной системы.
Объекты WaitHandle представляют объекты ожидания операционной системы, удобны для синхронизации между управляемым и неуправляемым кодом и предоставляют некоторые расширенные функции операционной системы, например возможность ожидания сразу нескольких объектов.
...
Рейтинг: 0 / 0
03.07.2018, 11:24
    #39668672
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
hVosttViPRos,

Если у тебя преимущественно больше чтения, чем записи, можешь посмотреть в сторону ReaderWriterLockSlim.
Задачу я выше описал.
...
Рейтинг: 0 / 0
03.07.2018, 11:26
    #39668676
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
ViPRosDima T,

хреново что 64, у меня объектов может быть больше намного
Читай внимательней что я писал.
Еще раз: объектов сколько угодно , хоть 100500, но только 64 объекта можно ждать одновременно (WaitAll() или WaitAny()).
...
Рейтинг: 0 / 0
03.07.2018, 11:56
    #39668699
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
ViPRos,

Я просто не увидел, с чем сравнивается.


ViPRosЗадачу я выше описал.

Всё равно не понятно, насколько больше чтения, чем записи.
В решении одной задачи у меня смена Monitor на RWSL существенно увеличило производительность, я также учёл переход в режим Update, без рекурсии.
...
Рейтинг: 0 / 0
03.07.2018, 12:18
    #39668719
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
Dima TViPRosDima T,

хреново что 64, у меня объектов может быть больше намного
Читай внимательней что я писал.
Еще раз: объектов сколько угодно , хоть 100500, но только 64 объекта можно ждать одновременно (WaitAll() или WaitAny()).
ну, я понял, надо делать как и с монитором - не пользоваться WaitAll/Any

Просто я думал - может WaitAll/Any как т по особому этот массив обрабатывают (для массива мониторов нужен еще один монитор - вощем получается многоуровневая структура мониторов)
...
Рейтинг: 0 / 0
03.07.2018, 12:20
    #39668721
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
hVosttViPRos,

Я просто не увидел, с чем сравнивается.


ViPRosЗадачу я выше описал.

Всё равно не понятно, насколько больше чтения, чем записи.
В решении одной задачи у меня смена Monitor на RWSL существенно увеличило производительность, я также учёл переход в режим Update, без рекурсии.
Нет ни чтения, ни записи - есть блокировка объектов на время работы критической секции
...
Рейтинг: 0 / 0
03.07.2018, 12:22
    #39668725
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
Интересно, почему нет исходников Enter и т.д. в Monitor.cs
...
Рейтинг: 0 / 0
03.07.2018, 12:47
    #39668745
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
ViPRosПросто я думал - может WaitAll/Any как т по особому этот массив обрабатывают (для массива мониторов нужен еще один монитор - вощем получается многоуровневая структура мониторов)
По-особому. Потому что внутри используется виндовая WaitForMultipleObjects() , а для мониторов ( CRITICAL_SECTION ) ничего похожего нет.

PS Если для мониторов ты делал самодельный WaitAll(), то скорее всего он будет тормознее чем WaitAll() для эвентов.

PPS Для твоей задачи можно поизобретать самодельный объект для синхронизации. Менеджер ресурсов. Примерно так: обработчик регистрирует запрос нужных ресурсов и встает на ожидание, менеджер контролирует освобождение ресурсов и как только все нужные освободились - будит обработчика.
...
Рейтинг: 0 / 0
03.07.2018, 12:54
    #39668749
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
ViPRosИнтересно, почему нет исходников Enter и т.д. в Monitor.cs
Потому что они extern c атрибутом MethodImpl, у которого Value = MethodImplOptions.InternalCall, что означает
The call is internal, that is, it calls a method that is implemented within the common language runtime.
( https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions.aspx)
...
Рейтинг: 0 / 0
03.07.2018, 12:55
    #39668751
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
Dima TViPRosПросто я думал - может WaitAll/Any как т по особому этот массив обрабатывают (для массива мониторов нужен еще один монитор - вощем получается многоуровневая структура мониторов)
По-особому. Потому что внутри используется виндовая WaitForMultipleObjects() , а для мониторов ( CRITICAL_SECTION ) ничего похожего нет.

PS Если для мониторов ты делал самодельный WaitAll(), то скорее всего он будет тормознее чем WaitAll() для эвентов.

PPS Для твоей задачи можно поизобретать самодельный объект для синхронизации. Менеджер ресурсов. Примерно так: обработчик регистрирует запрос нужных ресурсов и встает на ожидание, менеджер контролирует освобождение ресурсов и как только все нужные освободились - будит обработчика.


Думал о менеджере ресурсов. Но, менеджер этот тоже должен быть синхронизирован.
...
Рейтинг: 0 / 0
03.07.2018, 12:58
    #39668752
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
Наверное, легче сделать иерархию AutoResetEvents (по 64 в блоке), вощем все это я уже делал для монитора
потому что WaitAll действительно по особому
...
Рейтинг: 0 / 0
03.07.2018, 13:08
    #39668757
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
ViPRosДумал о менеджере ресурсов. Но, менеджер этот тоже должен быть синхронизирован.
Его надо вынести в отдельный поток. Запросы передавать через очередь.
Т.е. сам менеджер однопоточный, ждет сообщения из очереди, по мере поступления обрабатывает.
Внутри сообщения AutoResetEvent для пробуждения обработчика и указание требуемых ему ресурсов.
Т.е. как только ресурсы освободились - будим обработчик и закрепляем ресурсы за ним, по окончании он сообщает что закончил, ресурсы освобождаются и т.д.

Осталось придумать как быстро отслеживать кому какие ресурсы нужны :)
...
Рейтинг: 0 / 0
03.07.2018, 13:18
    #39668766
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
Dima TОсталось придумать как быстро отслеживать кому какие ресурсы нужны :)
Как вариант: массив счетчиков для обработчиков, при регистрации прописываем их количество:
Код: plaintext
1.
worker[i] = N


для ресурсов массив массивов (List<List<int>>), т.е. по одному массиву на каждый ресурс, а во внутренний массив писать список обработчиков, ожидающих ресурс.
При регистрации обработчика он добавляется во все ресурсы.

При освобождении ресурса проходим по списку привязанных к нему обработчиков и делаем всем worker[i]--, как только получили 0 - значит все необходимые ресурсы свободны и можно запускать обработчик.
При блокировке ресурса - всем ожидающим worker[i]++

ИМХО в однопоточном варианте должно достаточно быстро работать
...
Рейтинг: 0 / 0
03.07.2018, 13:20
    #39668771
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
Dima TКак вариант: массив счетчиков для обработчиков, при регистрации прописываем их количество:
Код: plaintext
1.
worker[i] = N


опечатка: записываем количество требуемых ресурсов.
...
Рейтинг: 0 / 0
03.07.2018, 13:33
    #39668778
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
ViPRosНаверное, легче сделать иерархию AutoResetEvents (по 64 в блоке), вощем все это я уже делал для монитора
потому что WaitAll действительно по особому
Тут тоже не все просто. Каждый WaitAll() должен работать в своем потоке, затем надо их как-то синхронизировать, т.е. еще один поток ожидающий все первые.
Сразу просматривается проблема: в первом WaitAll() все ресурсы освободились, а во втором - нет. Что дальше делать? Первый сигналит что "свободно" и требует что-то делать, перестать ожидать первые - а вдруг пока второй набор освобождался в первом уже опять что-то заняли.

Как вариант (без больших переделок): разбиваем ресурсы на кучки по 64, ожидание первой (один WaitAll()), при сработке допроверка остальных, если какая-то несвободна, то ждем ее и т.д. по кругу. Как все освободились - закончили ожидание.
...
Рейтинг: 0 / 0
03.07.2018, 13:37
    #39668781
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AutoResetEvent vs Monitor
Dima T,

этот менеджер скорее всего станет узким местом
у меня тут много режимов работы
однопоточный
2поточный (тут нет блокировок)
многопоточный (управляемое количество потоков)

все это работает в зависимости от структуры ресурсов, характера конкуренции

ну я думал о менеджере много раз не стал реализовывать в коде так как

это долбаные ресурсы любят объединиться в долговременные и кратковременные пулы, одновременно могут быть членами разных пулов, могут блокироваться частично (% мощности) и т.д.
нужны стационарные менеджеры и диспетчеры, которые вообще то сами являются обычными ресурсами и т.д.
хотел как то перевести на Акку, н не получилось концептуально (в мозгах)


а воще то задача - моделировать производственно/финансовые мощности холдинга и построить план работ
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / AutoResetEvent vs Monitor / 25 сообщений из 89, страница 1 из 4
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]