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


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