Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
 Re: AutoResetEvent vs Monitor  [new]
hVostt
Member

Откуда:
Сообщений: 16515
ViPRos
это поле статик - задается при конфигурации


это все выглядит как костыли, может лучше бы подошли потокобезопасные очереди.
3 июл 18, 15:59    [21539675]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
hVostt
ViPRos
lock (algroup)


Почему не использовать потокобезопасные коллекции? Так блокировать коллекции не по феншую, да и не блокирует доступ к коллекции.

они все потокобезопасные :)
но их можно использовать как объект блокировки
3 июл 18, 16:00    [21539677]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
Petro123
hVostt
пропущено...


Почему не использовать потокобезопасные коллекции? Так блокировать коллекции не по феншую, да и не блокирует доступ к коллекции.

+1
Тогда и сабж монитор не понадобится)

пшел нах
3 июл 18, 16:00    [21539680]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
hVostt
Member

Откуда:
Сообщений: 16515
hVostt
ViPRos
это поле статик - задается при конфигурации


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


хотя может это тот случай, когда что-то рабочее за вменяемое время написать -- уже победа.
3 июл 18, 16:00    [21539681]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
hVostt
Member

Откуда:
Сообщений: 16515
ViPRos
они все потокобезопасные :)
но их можно использовать как объект блокировки


это только если ты знаешь, что к коллекции надо обращаться только через критическую секцию, так делать не рекомендуется, настоятельно :)
3 июл 18, 16:01    [21539686]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
hVostt
Member

Откуда:
Сообщений: 16515
ViPRos,

или ты просто сэкономил на лок-объкете )
3 июл 18, 16:02    [21539691]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
hVostt
hVostt
пропущено...


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


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

Хвост не горячись - потокобезопасность коллекции делают потокобезопасным только их, а не твой код
все коллекции там потокобезопасные (кроме особых случаев - созданы только для лока)
3 июл 18, 16:02    [21539692]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
hVostt
ViPRos,

или ты просто сэкономил на лок-объкете )

ну я ж прогер 40 летним стажем :) ячейка память бережет!
3 июл 18, 16:03    [21539696]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
Dima T
Member

Откуда:
Сообщений: 14328
ViPRos
Этих algroup много - lock (algroup) пропускает неоднотипные процессы

а если не сделать lock (monLockStru) то все однотипные процессы ломанутся одновременно и будет дедлок

Но в коде с эвентами вызов WaitAll() вынесен за блокировку. Если не путаю WaitAll() не блокирует AutoResetEvent, в WinAPI это так, как тут - не знаю. Если так, то у тебя вообще нет блокировок AutoResetEvent.
3 июл 18, 16:06    [21539707]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
Dima T
ViPRos
Этих algroup много - lock (algroup) пропускает неоднотипные процессы

а если не сделать lock (monLockStru) то все однотипные процессы ломанутся одновременно и будет дедлок

Но в коде с эвентами вызов WaitAll() вынесен за блокировку. Если не путаю WaitAll() не блокирует AutoResetEvent, в WinAPI это так, как тут - не знаю. Если так, то у тебя вообще нет блокировок AutoResetEvent.

Ты не внимателен - коллекции areEvents, monEvents локальные
3 июл 18, 16:09    [21539722]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
а блокировка сразу задается в конструкторе ивента
3 июл 18, 16:09    [21539726]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
ViPRos,
Как сказал ....."ты злишься, значит неправ))"
3 июл 18, 16:10    [21539728]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
Petro123
ViPRos,
Как сказал ....."ты злишься, значит неправ))"

не я не злюсь, просто мы кои-то веки без тебя тут пару часов по человечески поговорили, а тут ты!
3 июл 18, 16:12    [21539737]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
Dima T
Member

Откуда:
Сообщений: 14328
ViPRos
Ты не внимателен - коллекции areEvents, monEvents локальные

Я про lock (algroup). Эвенты ждутся после этого лока, а мониторы внутри.
+ выделил нужные строки
ViPRos
Код (создание процесса - очень большой), а так

начало
                    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);
                                }
                            }
                        }
                    }


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


и конец

                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()
3 июл 18, 16:17    [21539759]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
ViPRos
они все потокобезопасные :)

Сожалею, но это не отмаз).
3 июл 18, 16:20    [21539771]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
Dima T
ViPRos
Ты не внимателен - коллекции areEvents, monEvents локальные

Я про lock (algroup). Эвенты ждутся после этого лока, а мониторы внутри.
+ выделил нужные строки
ViPRos
Код (создание процесса - очень большой), а так

начало
                    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);
                                }
                            }
                        }
                    }


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


и конец

                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 двери захлопываются
3 июл 18, 16:26    [21539793]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
System.collections.concurrent.
Минимальный лок на минимальное время содердится в коде метода
List.Add(Object).
А потом уже мониторы, семафоры и блок по логике процессов.
3 июл 18, 16:27    [21539796]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
hVostt
Member

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

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


всё же тут напрашивается rx )
3 июл 18, 16:29    [21539802]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
Petro123
ViPRos
они все потокобезопасные :)

Сожалею, но это не отмаз).

му**ло, они все ConcurrentDictionary, Bag, Queue, Satck, ...
3 июл 18, 16:30    [21539805]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

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

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


всё же тут напрашивается rx )

RXы внутри точно так же сделаны
3 июл 18, 16:31    [21539809]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
hVostt
Member

Откуда:
Сообщений: 16515
ViPRos
RXы внутри точно так же сделаны


это верно, но позволяет не городить огороды, и сосредоточиться на главном
3 июл 18, 16:34    [21539817]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
hVostt
ViPRos
RXы внутри точно так же сделаны


это верно, но позволяет не городить огороды, и сосредоточиться на главном

Хвост!!!!!
Я показал 10 строк кода! Какой еще огород!!!
3 июл 18, 16:36    [21539823]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
И тут это самое главное - запустить параллельно те процессы, которые не претендуют на одни и те же ресурсы.
Эти 5-10 строк кода полностью решают данную задачу.
3 июл 18, 16:38    [21539831]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
ViPRos
Petro123
пропущено...

Сожалею, но это не отмаз).

му**ло, они все ConcurrentDictionary, Bag, Queue, Satck, ...

Да?
У них ConcurrentDictionary появился метод Add(.....
Уверен?
"Ты материшься значит не прав"
3 июл 18, 16:39    [21539836]     Ответить | Цитировать Сообщить модератору
 Re: AutoResetEvent vs Monitor  [new]
ViPRos
Member

Откуда:
Сообщений: 9710
Petro123
ViPRos
пропущено...

му**ло, они все ConcurrentDictionary, Bag, Queue, Satck, ...

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


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


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

Хвост не горячись - потокобезопасность коллекции делают потокобезопасным только их, а не твой код
все коллекции там потокобезопасные (кроме особых случаев - созданы только для лока)
3 июл 18, 16:45    [21539857]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить