powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / AutoResetEvent vs Monitor
25 сообщений из 89, страница 2 из 4
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
25 сообщений из 89, страница 2 из 4
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / AutoResetEvent vs Monitor
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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