powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / AutoResetEvent vs Monitor
89 сообщений из 89, показаны все 4 страниц
AutoResetEvent vs Monitor
    #39668551
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде по всем докам Monitor должен работать быстрее, но у меня получается наоборот. Или я что то пропустил?
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668565
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosВроде по всем докам Monitor должен работать быстрее, но у меня получается наоборот.
Анекдот про сферического коня в вакууме процитировать?
Монитор - это аналог critical section, и существует внутри одного процесса. AutoResetEvent и ManualResetEvent видны в разных процессах, что влечет за собой некоторый оверхед в реализации. Ну, и плюс специфика использования тех и других несколько разная. Вне контекста задачи говорить о предпочтительности использования того или другого бессмысленно.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668606
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

PPS Для твоей задачи можно поизобретать самодельный объект для синхронизации. Менеджер ресурсов. Примерно так: обработчик регистрирует запрос нужных ресурсов и встает на ожидание, менеджер контролирует освобождение ресурсов и как только все нужные освободились - будит обработчика.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668749
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
AutoResetEvent vs Monitor
    #39668751
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TViPRosПросто я думал - может WaitAll/Any как т по особому этот массив обрабатывают (для массива мониторов нужен еще один монитор - вощем получается многоуровневая структура мониторов)
По-особому. Потому что внутри используется виндовая WaitForMultipleObjects() , а для мониторов ( CRITICAL_SECTION ) ничего похожего нет.

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

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


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

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


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

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

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


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

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

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

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

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

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


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

ViPRosхотел как то перевести на Акку, н не получилось концептуально (в мозгах)
ИМХО задача не подходит для Акки.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668822
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

ну, менеджер этот в мозгах уже лет 20 сидит, но он сцуко один в один повторяет структуру предприятия
а в структуре есть и мобильные ресурсы (активные и пассивные) - транспорт, многостаночники, наладчики

даже стационарные непросты - хорошо когда рабочее место содержит стационарный станок, набор инструментов, приспособлений, прикрепленного набора рабочих, а есть просто пустое место, где можно собраться и поработать вместе мобильным и .д.

очень сложная структура и объекты все со сложным поведением


при этом!!! - сама критическая секция (запланировать единицу работы) работает так быстро, что телодвижения с блокировкой этих ресурсов отнимают офигенное количество времени
когда мощности хорошо сбалансированы под работы не особо большая разница во времени, что в один поток, что в 100

потому остерегаюсь создавать эти менеджеры - пытаюсь обойтись примитивами
но когда нить для души попробую полностью симулировать
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668825
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так все это один в один повторяет механизм эскалации блокировок МССКЛ :)
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668832
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сейчас вообще то у меня самая серьезная проблема - запись сгенерированной информации в СУБД
на ноуте за минуту генерируется 1000 000 процессов (~ 10 000 000 записей) а запись отнимает 5-7 минут (с учетом всех распараллеливаний, симплов, балков, 610 и т.д фигни)
куда бы архитектурно эту инфу сбагрить бл*
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668835
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в реале надо 50 - 70 000 000 процессов и хорошо бы не больше тех 1-5 минут
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668859
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosпри этом!!! - сама критическая секция (запланировать единицу работы) работает так быстро, что телодвижения с блокировкой этих ресурсов отнимают офигенное количество времени
когда мощности хорошо сбалансированы под работы не особо большая разница во времени, что в один поток, что в 100
Код надо смотреть, так сложно что-то понять.

ViPRosпотому остерегаюсь создавать эти менеджеры - пытаюсь обойтись примитивами
но когда нить для души попробую полностью симулировать
Если тебе надо WaitAll() то однозначно уходи хотя бы на Event`ы, т.к. самодельный WaitAll() на мониторах - это извращение.

ИМХО мой вариант с "кучками" 21539166 может заработать и переделка небольшая.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668877
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Ну, я ж согласился что надо блоками ивентов управлять
Я почему то думал, что монитор что то легковесное (в принципе везде так и написано, а исходников нет что бы посмотреть)
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668879
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код (создание процесса - очень большой), а так

начало
Код: c#
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.
                    var alg = algroup.Where(ag => stru.Equals(Guid.Empty) || ag.Value.Select(v => v.struel).Contains(stru)).ToArray();

                    if (autoResetEvents)
                    {
                        lock (algroup)
                        {
                            lock (areLockStru)
                            {
                                foreach (var g in alg)
                                {
                                    var dstru = g.Value.Select(v => v.struel).FirstOrDefault();
                                    AutoResetEvent ev;
                                    if (!areLockStru.TryGetValue(dstru, out ev))
                                    {
                                        ev = new AutoResetEvent(true);
                                        areLockStru.Add(dstru, ev);
                                    }
                                    if (!areEventsObjects.Contains(ev)) areEventsObjects.Add(ev);
                                }
                            }
                        }
                        AutoResetEvent.WaitAll(areEventsObjects.ToArray());
                    }
                    else
                    {
                        if (monitorEvents)
                        {
                            lock (algroup)
                            {
                                lock (monLockStru)
                                {
                                    foreach (var g in alg)
                                    {
                                        var dstru = g.Value.Select(v => v.struel).FirstOrDefault();
                                        object ev;
                                        if (!monLockStru.TryGetValue(dstru, out ev))
                                        {
                                            ev = new object();
                                            monLockStru.Add(dstru, ev);
                                        }
                                        if (!monitorEventsObjects.Contains(ev)) monitorEventsObjects.Add(ev);
                                    }
                                    foreach (var e in monitorEventsObjects) Monitor.Enter(e);
                                }
                            }
                        }
                    }



-----------блабла


и конец

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
                if (autoResetEvents)
                {
                    foreach (var ev in areEventsObjects) ev.Set();
                    areEventsObjects.Clear();
                }
                else
                {
                    if (monitorEvents)
                    {
                        foreach (var ev in monitorEventsObjects) Monitor.Exit(ev);
                        monitorEventsObjects.Clear();
                    }
                }
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668882
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosсейчас вообще то у меня самая серьезная проблема - запись сгенерированной информации в СУБД

у тебя?

вообще-т 99% узких мест, это IO операции.

если нет желания/возможности масштабирования операций, то в сторону акка нет смысла.

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

если бы ты работал с асинхронным IO, то Monitor тут не получится использовать
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668894
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttесли нет желания/возможности масштабирования операций, то в сторону акка нет смысла.

думал о реактивном подходе?
ну, акка просто не подходит, неохота вспоминать почему
все эти rx тоже под наблюдением
пока что лучше всего TPL DataFlow, но для того что бы перейти надо кучу вещей переписать - создать конвеер
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668898
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
Код: c#
1.
lock (algroup)



Почему не использовать потокобезопасные коллекции? Так блокировать коллекции не по феншую, да и не блокирует доступ к коллекции.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668900
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosну, акка просто не подходит, неохота вспоминать почему

Да тут и нечего вспоминать, весь смысл акторов в масштабировании, кто бы там чего не говорил. В рамках одного процесса акторы -- оверхед без видимого профита.

ViPRosпока что лучше всего TPL DataFlow, но для того что бы перейти надо кучу вещей переписать - создать конвеер

Неблокирующий конвеер -- наверное лучшее, что можно придумать, согласен.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668902
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
                            lock (algroup)
                            {
                                lock (monLockStru)
                                {
                                    foreach (var g in alg)
                                    {
                                        var dstru = g.Value.Select(v => v.struel).FirstOrDefault();
                                        object ev;
                                        if (!monLockStru.TryGetValue(dstru, out ev))
                                        {
                                            ev = new object();
                                            monLockStru.Add(dstru, ev);
                                        }
                                        if (!monitorEventsObjects.Contains(ev)) monitorEventsObjects.Add(ev);
                                    }
                                    foreach (var e in monitorEventsObjects) Monitor.Enter(e);
                                }
                            }


У тебя захват блокировок внутри блокировки, т.е. чтобы начать захватывать ресурсы надо захватить algroup и monLockStru. Это гарантирует что все задачи последовательно будут выполнятся, т.к. пока хоть одна задача висит на ожидании какого-нибудь ресурса, то другие потоки висят на lock (algroup)

Как минимум надо вынести этот цикл за lock (algroup)
Код: c#
1.
foreach (var e in monitorEventsObjects) Monitor.Enter(e);
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668906
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRos,

если бы ты работал с асинхронным IO, то Monitor тут не получится использовать
IO асинхронная (в таких же тасках, без begin/end)

Монитор в принципе плохой, его самого надо монитором закрывать, а не то стартуют процессы - клоны
а чем асинхронность записи мешает монитору не знаю
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668907
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
Код: c#
1.
2.
3.
4.
if (monitorEvents)
                        {
                            lock (algroup)
                            {



if надо либо ещё раз выполнять после входа в критическую секцию, или выполнять внутри, иначе это небезопасно :)
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668909
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
                            lock (algroup)
                            {
                                lock (monLockStru)
                                {
                                    foreach (var g in alg)
                                    {
                                        var dstru = g.Value.Select(v => v.struel).FirstOrDefault();
                                        object ev;
                                        if (!monLockStru.TryGetValue(dstru, out ev))
                                        {
                                            ev = new object();
                                            monLockStru.Add(dstru, ev);
                                        }
                                        if (!monitorEventsObjects.Contains(ev)) monitorEventsObjects.Add(ev);
                                    }
                                    foreach (var e in monitorEventsObjects) Monitor.Enter(e);
                                }
                            }


У тебя захват блокировок внутри блокировки, т.е. чтобы начать захватывать ресурсы надо захватить algroup и monLockStru. Это гарантирует что все задачи последовательно будут выполнятся, т.к. пока хоть одна задача висит на ожидании какого-нибудь ресурса, то другие потоки висят на lock (algroup)

Как минимум надо вынести этот цикл за lock (algroup)
Код: c#
1.
foreach (var e in monitorEventsObjects) Monitor.Enter(e);



Этих algroup много - lock (algroup) пропускает неоднотипные процессы

а если не сделать lock (monLockStru) то все однотипные процессы ломанутся одновременно и будет дедлок
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668910
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
foreach (var e in monitorEventsObjects) Monitor.Enter(e);


так делать тоже нельзя, т.к. ты заранее блокируешь ресурсы. Например тебе надо ресурсы 1,3,5. В этом цикле ты заблокировал 1 и 3, а 5 оказался занят и ты повис в ожидании, но при этом 1 и 3 тобой заблокированы, но ты ими не пользуешься, т.к. ждешь 5.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668911
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это такое двойное сито перед блокировкой
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668912
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: c#
1.
foreach (var e in monitorEventsObjects) Monitor.Enter(e);


так делать тоже нельзя, т.к. ты заранее блокируешь ресурсы. Например тебе надо ресурсы 1,3,5. В этом цикле ты заблокировал 1 и 3, а 5 оказался занят и ты повис в ожидании, но при этом 1 и 3 тобой заблокированы, но ты ими не пользуешься, т.к. ждешь 5.

именно для этого и блокировка lock (monLockStru)
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668913
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosМонитор в принципе плохой, его самого надо монитором закрывать, а не то стартуют процессы - клоны
а чем асинхронность записи мешает монитору не знаю

тем, что код, находящийся после await, может быть выполнен в другом потоке, соответственно, блокировка на поток может быть проигнорирована, что приведёт к дедлоку.

т.е. надо использовать семафоры.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668914
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRosМонитор в принципе плохой, его самого надо монитором закрывать, а не то стартуют процессы - клоны
а чем асинхронность записи мешает монитору не знаю

тем, что код, находящийся после await, может быть выполнен в другом потоке, соответственно, блокировка на поток может быть проигнорирована, что приведёт к дедлоку.

т.е. надо использовать семафоры.
ну можно указать контекст если надо
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668916
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRos
Код: c#
1.
2.
3.
4.
if (monitorEvents)
                        {
                            lock (algroup)
                            {



if надо либо ещё раз выполнять после входа в критическую секцию, или выполнять внутри, иначе это небезопасно :)
это поле статик - задается при конфигурации
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668917
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRos
Код: c#
1.
lock (algroup)




Почему не использовать потокобезопасные коллекции? Так блокировать коллекции не по феншую, да и не блокирует доступ к коллекции.
+1
Тогда и сабж монитор не понадобится)
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668918
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да все в этом коде рабочее и протестировано
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668920
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosэто поле статик - задается при конфигурации

это все выглядит как костыли, может лучше бы подошли потокобезопасные очереди.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668921
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRos
Код: c#
1.
lock (algroup)



Почему не использовать потокобезопасные коллекции? Так блокировать коллекции не по феншую, да и не блокирует доступ к коллекции.
они все потокобезопасные :)
но их можно использовать как объект блокировки
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668922
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123hVosttпропущено...


Почему не использовать потокобезопасные коллекции? Так блокировать коллекции не по феншую, да и не блокирует доступ к коллекции.
+1
Тогда и сабж монитор не понадобится)
пшел нах
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668923
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRosэто поле статик - задается при конфигурации

это все выглядит как костыли, может лучше бы подошли потокобезопасные очереди.

хотя может это тот случай, когда что-то рабочее за вменяемое время написать -- уже победа.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668925
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosони все потокобезопасные :)
но их можно использовать как объект блокировки

это только если ты знаешь, что к коллекции надо обращаться только через критическую секцию, так делать не рекомендуется, настоятельно :)
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668927
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

или ты просто сэкономил на лок-объкете )
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668928
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostthVosttпропущено...


это все выглядит как костыли, может лучше бы подошли потокобезопасные очереди.

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

или ты просто сэкономил на лок-объкете )
ну я ж прогер 40 летним стажем :) ячейка память бережет!
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668932
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosЭтих algroup много - lock (algroup) пропускает неоднотипные процессы

а если не сделать lock (monLockStru) то все однотипные процессы ломанутся одновременно и будет дедлок
Но в коде с эвентами вызов WaitAll() вынесен за блокировку. Если не путаю WaitAll() не блокирует AutoResetEvent, в WinAPI это так, как тут - не знаю. Если так, то у тебя вообще нет блокировок AutoResetEvent.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668934
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TViPRosЭтих algroup много - lock (algroup) пропускает неоднотипные процессы

а если не сделать lock (monLockStru) то все однотипные процессы ломанутся одновременно и будет дедлок
Но в коде с эвентами вызов WaitAll() вынесен за блокировку. Если не путаю WaitAll() не блокирует AutoResetEvent, в WinAPI это так, как тут - не знаю. Если так, то у тебя вообще нет блокировок AutoResetEvent.
Ты не внимателен - коллекции areEvents, monEvents локальные
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668935
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а блокировка сразу задается в конструкторе ивента
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668937
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,
Как сказал ....."ты злишься, значит неправ))"
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668939
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ViPRos,
Как сказал ....."ты злишься, значит неправ))"
не я не злюсь, просто мы кои-то веки без тебя тут пару часов по человечески поговорили, а тут ты!
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668942
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosТы не внимателен - коллекции areEvents, monEvents локальные
Я про lock (algroup). Эвенты ждутся после этого лока, а мониторы внутри.
выделил нужные строкиViPRosКод (создание процесса - очень большой), а так

начало
Код: c#
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.
                    var alg = algroup.Where(ag => stru.Equals(Guid.Empty) || ag.Value.Select(v => v.struel).Contains(stru)).ToArray();

                    if (autoResetEvents)
                    {
                        lock (algroup)
                        {
                            lock (areLockStru)
                            {
                                foreach (var g in alg)
                                {
                                    var dstru = g.Value.Select(v => v.struel).FirstOrDefault();
                                    AutoResetEvent ev;
                                    if (!areLockStru.TryGetValue(dstru, out ev))
                                    {
                                        ev = new AutoResetEvent(true);
                                        areLockStru.Add(dstru, ev);
                                    }
                                    if (!areEventsObjects.Contains(ev)) areEventsObjects.Add(ev);
                                }
                            }
                        }
                       AutoResetEvent.WaitAll(areEventsObjects.ToArray());
                    }
                    else
                    {
                        if (monitorEvents)
                        {
                            lock (algroup)
                            {
                                lock (monLockStru)
                                {
                                    foreach (var g in alg)
                                    {
                                        var dstru = g.Value.Select(v => v.struel).FirstOrDefault();
                                        object ev;
                                        if (!monLockStru.TryGetValue(dstru, out ev))
                                        {
                                            ev = new object();
                                            monLockStru.Add(dstru, ev);
                                        }
                                        if (!monitorEventsObjects.Contains(ev)) monitorEventsObjects.Add(ev);
                                    }
                                    foreach (var e in monitorEventsObjects) Monitor.Enter(e);
                                }
                            }
                        }
                    }



-----------блабла


и конец

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
                if (autoResetEvents)
                {
                    foreach (var ev in areEventsObjects) ev.Set();
                    areEventsObjects.Clear();
                }
                else
                {
                    if (monitorEvents)
                    {
                        foreach (var ev in monitorEventsObjects) Monitor.Exit(ev);
                        monitorEventsObjects.Clear();
                    }
                }


Про блокировку AutoResetEvent.WaitAll() ничего не нашел, в хэлпе только про WaitOne()
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668943
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosони все потокобезопасные :)
Сожалею, но это не отмаз).
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668946
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TViPRosТы не внимателен - коллекции areEvents, monEvents локальные
Я про lock (algroup). Эвенты ждутся после этого лока, а мониторы внутри.
выделил нужные строкиViPRosКод (создание процесса - очень большой), а так

начало
Код: c#
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.
                    var alg = algroup.Where(ag => stru.Equals(Guid.Empty) || ag.Value.Select(v => v.struel).Contains(stru)).ToArray();

                    if (autoResetEvents)
                    {
                        lock (algroup)
                        {
                            lock (areLockStru)
                            {
                                foreach (var g in alg)
                                {
                                    var dstru = g.Value.Select(v => v.struel).FirstOrDefault();
                                    AutoResetEvent ev;
                                    if (!areLockStru.TryGetValue(dstru, out ev))
                                    {
                                        ev = new AutoResetEvent(true);
                                        areLockStru.Add(dstru, ev);
                                    }
                                    if (!areEventsObjects.Contains(ev)) areEventsObjects.Add(ev);
                                }
                            }
                        }
                       AutoResetEvent.WaitAll(areEventsObjects.ToArray());
                    }
                    else
                    {
                        if (monitorEvents)
                        {
                            lock (algroup)
                            {
                                lock (monLockStru)
                                {
                                    foreach (var g in alg)
                                    {
                                        var dstru = g.Value.Select(v => v.struel).FirstOrDefault();
                                        object ev;
                                        if (!monLockStru.TryGetValue(dstru, out ev))
                                        {
                                            ev = new object();
                                            monLockStru.Add(dstru, ev);
                                        }
                                        if (!monitorEventsObjects.Contains(ev)) monitorEventsObjects.Add(ev);
                                    }
                                    foreach (var e in monitorEventsObjects) Monitor.Enter(e);
                                }
                            }
                        }
                    }



-----------блабла


и конец

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
                if (autoResetEvents)
                {
                    foreach (var ev in areEventsObjects) ev.Set();
                    areEventsObjects.Clear();
                }
                else
                {
                    if (monitorEvents)
                    {
                        foreach (var ev in monitorEventsObjects) Monitor.Exit(ev);
                        monitorEventsObjects.Clear();
                    }
                }


Про блокировку AutoResetEvent.WaitAll() ничего не нашел, в хэлпе только про WaitOne()

Ну все правильно
==> foreach (var e in monitorEventsObjects) Monitor.Enter(e);
установили блокировку (только не для себя, мы не ждем эти события - мы их для других поставили)

тут тоже для себя зеленая дорога (сигнал установлен в конструкторе), а после WaitAll двери захлопываются
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668949
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
System.collections.concurrent.
Минимальный лок на минимальное время содердится в коде метода
List.Add(Object).
А потом уже мониторы, семафоры и блок по логике процессов.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668953
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosНу все правильно
==> foreach (var e in monitorEventsObjects) Monitor.Enter(e);
установили блокировку (только не для себя, мы не ждем эти события - мы их для других поставили)

тут тоже для себя зеленая дорога (сигнал установлен в конструкторе), а после WaitAll двери захлопываются

всё же тут напрашивается rx )
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668954
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ViPRosони все потокобезопасные :)
Сожалею, но это не отмаз).
му**ло, они все ConcurrentDictionary, Bag, Queue, Satck, ...
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668955
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRosНу все правильно
==> foreach (var e in monitorEventsObjects) Monitor.Enter(e);
установили блокировку (только не для себя, мы не ждем эти события - мы их для других поставили)

тут тоже для себя зеленая дорога (сигнал установлен в конструкторе), а после WaitAll двери захлопываются

всё же тут напрашивается rx )
RXы внутри точно так же сделаны
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668958
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosRXы внутри точно так же сделаны

это верно, но позволяет не городить огороды, и сосредоточиться на главном
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668961
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRosRXы внутри точно так же сделаны

это верно, но позволяет не городить огороды, и сосредоточиться на главном
Хвост!!!!!
Я показал 10 строк кода! Какой еще огород!!!
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668962
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И тут это самое главное - запустить параллельно те процессы, которые не претендуют на одни и те же ресурсы.
Эти 5-10 строк кода полностью решают данную задачу.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668963
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosPetro123пропущено...

Сожалею, но это не отмаз).
му**ло, они все ConcurrentDictionary, Bag, Queue, Satck, ...
Да?
У них ConcurrentDictionary появился метод Add(.....
Уверен?
"Ты материшься значит не прав"
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668971
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ViPRosпропущено...

му**ло, они все ConcurrentDictionary, Bag, Queue, Satck, ...
Да?
У них ConcurrentDictionary появился метод Add(.....
Уверен?
"Ты материшься значит не прав"

Как же ты надоел
ViPRoshVosttпропущено...


хотя может это тот случай, когда что-то рабочее за вменяемое время написать -- уже победа.
Хвост не горячись - потокобезопасность коллекции делают потокобезопасным только их, а не твой код
все коллекции там потокобезопасные (кроме особых случаев - созданы только для лока)
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668978
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosХвост!!!!!
Я показал 10 строк кода! Какой еще огород!!!

ну огород с локами, я просто всегда думаю в контексте разработки, в которой участвует много людей, и с учётом того, что люди приходят/уходят, поэтому, да, огород :)

а также скорее всего, получится организовать конвеер с очередью.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668979
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosИ тут это самое главное - запустить параллельно те процессы, которые не претендуют на одни и те же ресурсы.
Эти 5-10 строк кода полностью решают данную задачу.

ну ок :) для обсуждения нужна была бы понятная, пусть упрощённая, но полная задача.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668982
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttа также скорее всего, получится организовать конвеер с очередью.
с конвеером есть проблемы - не все процессы идут прямоточно
есть процессы со сроками хранения продукции, с гарантийными сроками и т.д. и часто не укладываешься в эти сроки
их приходится вернуть в очередь, вся цепочка уничтожается и идет перепланировка
скорее всего можно что то придумать - в следующий раз переведу все в DataFlow (если доживу)
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39668986
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRosИ тут это самое главное - запустить параллельно те процессы, которые не претендуют на одни и те же ресурсы.
Эти 5-10 строк кода полностью решают данную задачу.

ну ок :) для обсуждения нужна была бы понятная, пусть упрощённая, но полная задача.
задача полная m работ n ресурсов …. - в постановка теории расписаний - т.е. самая упрощенная модель
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39669043
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
rx не вижу для него.
У rx основа события извне. Причем асинхронные.
А у него обсчёт вариантов.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39669103
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosDima Tпропущено...

Я про lock (algroup). Эвенты ждутся после этого лока, а мониторы внутри.
выделил нужные строкипропущено...

Про блокировку AutoResetEvent.WaitAll() ничего не нашел, в хэлпе только про WaitOne()

Ну все правильно
==> foreach (var e in monitorEventsObjects) Monitor.Enter(e);
установили блокировку (только не для себя, мы не ждем эти события - мы их для других поставили)

тут тоже для себя зеленая дорога (сигнал установлен в конструкторе), а после WaitAll двери захлопываются
Я просил код где максимальная нагрузка, а ты старт-стоп показал, самое важное вырезал. Не хочешь обсуждать - твое право, но зачем так тролить? Удачи.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39669186
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ просил код где максимальная нагрузка, а ты старт-стоп показал, самое важное вырезал. Не хочешь обсуждать - твое право, но зачем так тролить? Удачи.
Да там обычный код вычислительный (создается множество производственных процессов для производственных структур, которые заблокированы как раз этими строчками и выбирается лучший процесс по заданному критерию при заданных ограничениях), ничего особенного (но объемом в несколько тыщ строк). Код этот очень быстрый и не требует оптимизации. Раньше однопоточная версию устраивала, так как процессов таких надо было выбрать 2-5 миллиона из 10-20. Теперь цифры выросли на порядок и мне надо как то все это вертикально масштабировать, потому решил и этот код распараллелить.
А распараллеливание этого кода не всегда может быть эффективен. Допустим, если производственных мощностей мало и они универсальны, то все техпроцессы будут выполняться на любом из них (или все рабочие универсальны), тогда по любе алгоритм все процессы поставить в очередь это как многозадачность в однопроцессорной машине без IO). Тут распараллеливание только мешает.
Потому самая сложная задача ФОРМИРОВАНИЕ этой очереди (фронта работ) для алгоритма планирования. Это похоже на выталкивание по приоритетам (которые вычисляются в зависимости от производственных структур, структуры работ и т.д. много параметров.
Если коротко, то делается вот что.
1. Кто то разузловывает изделие/проект... (которые в производственных заказах специфированы), находить терминальные ДСЕ, выбирает все альтернативные ТП и из их терминальных (начальных) операций формирует очередь процессов (ТП)
2. Кто то анализирует эту очередь на совместимость по многим политикам
- переналадки (упорядочение для минимизации)
- динамические сборы (печи, гальваника, транспорт,...покраска сушка - совместная обработка)
- технологические сборы (совместная обработка сопрягаемых поверхностей)
--
и выкидывает в фронт работ (оттуда можно их брать для планирования - где будем делать, кто будет, на чем будет, когда будет,... куча ограничений)
3. Кто то эти работы параллельно (раньше был один поток и он успевал) планирует и если что то не так все начинается с п.2
4. После того как какое то изделие/заказ/проект/…. окончательно запланирован идет параллельно запись.

Вот вся задача ооооочень коротоко.
Мы обсуждали часть п.3., которую я переделал недавно.

И я никого не троллил, а просто спросил кое что.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39669315
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

Интересно, а человек в этом алгоритме участвует? Может он внести изменения в процессе, или только на конечном или начальном этапах?
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39669415
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRos,

Интересно, а человек в этом алгоритме участвует? Может он внести изменения в процессе, или только на конечном или начальном этапах?

Человек управляет алгоритмом через политики, ограничения и параметры процессов.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39669555
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

То есть только на начальном этапе. Поправить "в середине" нельзя? Или исправить результат? Я понимаю, что это возможно вообще не требуется.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39669581
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRos,

То есть только на начальном этапе. Поправить "в середине" нельзя? Или исправить результат? Я понимаю, что это возможно вообще не требуется.

Хвост! Там миллионы процессов генерируются (да хоть сотни), что ты там хочешь в интерактиве делать?
Поправить всегда можно, после расчетов видны состояние заказов, указаны заказы с нарушениями директивных сроков и т.д.
Если что то не устраивает, то можешь менять политики, ограничения, параметры и запустить перерасчет.
А так делается по такой схеме.
1. Получили расписание.
2. Работаем и вводим факт.
3. На мониторе диспетчеров видны отклонения.
Когда отклонения не влезают ни в какие ворота (что решает диспетчер или программа по заданным политикам - допустим отклонение в сутки - перерасчет автоматически) инициируется перерасчет.
Перерасчет начинается локально (сначала внутри вышестоящего контекста - для РМ это допустим Участок, для Участка - Пролет, Цех и т.д.) и если можно отклонения компенсировать (т.е. планы других структурных элементов не затрагиваются), то перерасчет заканчивается) и идет эскалация до полной компенсации отклонений. В худшем случае (обычно когда выбраны неадекватные политики - допустим JIT) пересчитывается все расписание.
Потому очень важна скорость расчетов.
А так диспетчер может вручную переставить палки по своему усмотрению (основной режим работы всяких херовых ЕРП) - но я бы дал ему по башке за это.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39669588
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После первого расчета расписания получаются так называемые реперные точки (В ВИП.Производстве они называются "Устойчивые к перезапуску процессы". Если при перерасчете эти реперные точки смещены, то по идее я должен оповестить вышестоящие органы - владельцев этих процессов, но пока я это не сделал - нафиг никому ничего не надо.
Это точки обычно - моменты отгрузки покупателю, моменты пополнения запасов (закупки, кооперация,...,), финансовые операции и т.д. вещи связанные с внешней логистикой.
В принципе в серийном и массовом производстве после перерасчета расписание должна удалиться автоматически, оставив только реперные точки.
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39669652
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosКогда отклонения не влезают ни в какие ворота (что решает диспетчер или программа по заданным политикам - допустим отклонение в сутки - перерасчет автоматически) инициируется перерасчет.

Ну отклонения понятно, а переносы? По времени, или использование освободившихся ресурсов. Такое.


ViPRosА так диспетчер может вручную переставить палки по своему усмотрению (основной режим работы всяких херовых ЕРП) - но я бы дал ему по башке за это.

Я же не знаю, какие у вас регламенты. Часто самые умные и отлаженные процессы не всегда работают в контексте "данного случая".

В целом понятно.


ViPRosЕсли при перерасчете эти реперные точки смещены, то по идее я должен оповестить вышестоящие органы - владельцев этих процессов, но пока я это не сделал - нафиг никому ничего не надо.

А этот момент управляется только разработчиком?
...
Рейтинг: 0 / 0
AutoResetEvent vs Monitor
    #39669657
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttViPRosЕсли при перерасчете эти реперные точки смещены, то по идее я должен оповестить вышестоящие органы - владельцев этих процессов, но пока я это не сделал - нафиг никому ничего не надо.

А этот момент управляется только разработчиком?

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


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