Чем Опасен етот код
От: Аноним  
Дата: 10.10.10 09:34
Оценка:
 public class PCQueue
    {
        readonly object _locker = new object();
        Thread[] _workers;
        Queue<Action> _itemQ = new Queue<Action>();

        public PCQueue(int workerCount)
        {
            _workers = new Thread[workerCount];
            for (int i = 0; i < workerCount; i++)
                (_workers[i] = new Thread(Consume)).Start();
        }

        public void Shutdown()
        {
            for (int i = 0; i < _workers.Length; i++)
            {
               lock (_locker)
                {
                    _itemQ.Enqueue(null);           
                    Monitor.Pulse(_locker);          
                } 
            }
                

        }

        public void QueueWorkItem<T>(Action<T> action, T arg)
        {
            lock (_locker)
            {
                _itemQ.Enqueue(()=>action(arg));           
                Monitor.Pulse(_locker);         
            }
        }

        void Consume()
        {
            while (true)                       
            {                                   
                Action item;
                lock (_locker)
                {
                    while (_itemQ.Count == 0) Monitor.Wait(_locker);
                    item = _itemQ.Dequeue();
                }
                if (item == null) return;         
                item();                          
            }
        }
    }
Re: Чем Опасен етот код
От: QrystaL Украина  
Дата: 10.10.10 09:42
Оценка: 3 (1) +4
Наверное тем, что его трудно читать )))
Re[2]: Чем Опасен етот код
От: Аноним  
Дата: 10.10.10 10:00
Оценка: :)
Здравствуйте, QrystaL, Вы писали:

QL>Наверное тем, что его трудно читать )))

))))) Надеюсь так будет лудше
public class PCQueue
{
readonly object _locker = new object();
Thread[] _workers;
Queue<Action> _itemQ = new Queue<Action>();

public PCQueue(int workerCount)
{
_workers = new Thread[workerCount];
for (int i = 0; i < workerCount; i++)
(_workers[i] = new Thread(Consume)).Start();
}

public void Shutdown()
{
for (int i = 0; i < _workers.Length; i++)
{
lock (_locker)
{
_itemQ.Enqueue(null);
Monitor.Pulse(_locker);
}
}


}

public void QueueWorkItem<T>(Action<T> action, T arg)
{
lock (_locker)
{
_itemQ.Enqueue(()=>action(arg));
Monitor.Pulse(_locker);
}
}

void Consume()
{
while (true)
{
Action item;
lock (_locker)
{
while (_itemQ.Count == 0) Monitor.Wait(_locker);
item = _itemQ.Dequeue();
}
if (item == null) return;
item();
}
}
}
Re[3]: Чем Опасен етот код
От: _FRED_ Черногория
Дата: 10.10.10 11:00
Оценка:
Здравствуйте, Аноним, Вы писали:

QL>>Наверное тем, что его трудно читать )))

А>))))) Надеюсь так будет лудше
А>
А>public class PCQueue
А>{
А>readonly object _locker = new object();
А>Thread[] _workers;
А>Queue<Action> _itemQ = new Queue<Action>();


Добавьте ещё, пожалуйста, отступы. Всё ещё трудновато.
Help will always be given at Hogwarts to those who ask for it.
Re: Чем Опасен етот код
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.10.10 12:02
Оценка:
Здравствуйте, Аноним, Вы писали:

Наверное тем что он разжижает мозг его писателю. Непонятно зачем изобретать свой thread pool, работающий не очень эффективно, когда есть стандартный.
Re[2]: Чем Опасен етот код
От: Lloyd Россия  
Дата: 10.10.10 12:04
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Наверное тем что он разжижает мозг его писателю. Непонятно зачем изобретать свой thread pool, работающий не очень эффективно, когда есть стандартный.


Например, часто встречаются ситуации, когда их нужно более одного.
Re: Чем Опасен етот код
От: Lloyd Россия  
Дата: 10.10.10 12:07
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А вас с какой целью это интересует?
Если ради интереса — это одно. А если для работы, то всегда лучше взять готовое, например те же thread-safe коллекции из .net 4: BlockingCollection Overview
Re[3]: Чем Опасен етот код
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.10.10 12:09
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, gandjustas, Вы писали:


G>>Наверное тем что он разжижает мозг его писателю. Непонятно зачем изобретать свой thread pool, работающий не очень эффективно, когда есть стандартный.


L>Например, часто встречаются ситуации, когда их нужно более одного.


"Часто" это когда?
У меня ни разу такого не было.
Кроме того всю высокоуровневую логику лучше изобретать не привязываясь к потокам. Средств для этого полно.
Re[3]: Чем Опасен етот код
От: Sinix  
Дата: 10.10.10 12:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, QrystaL, Вы писали:


Пока багов не заметил, но, на всякий, натравите на него CHESS.
Re[4]: Чем Опасен етот код
От: Lloyd Россия  
Дата: 10.10.10 12:24
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

L>>Например, часто встречаются ситуации, когда их нужно более одного.


G>"Часто" это когда?

G>У меня ни разу такого не было.

А у меня были: есть задачи, которые периодически запускаются и работают в фоне, собирая разную статистику, они по смвоей природе длительные и обращаться к полученным данным будут очень нескоро; а есть интерактивные задачи, запускаемые пользователями с интерфейса, они — короткие, и результат жедательно получить тут же. Если будет 1 пул потоков, то дительные задачи его тупо забьют и не дадут выполняться задачам второго типа. 2 пула эту проблему снимают.

G>Кроме того всю высокоуровневую логику лучше изобретать не привязываясь к потокам. Средств для этого полно.


Пул — это механизм выполнение логики, причем тут привязывание?
Re[5]: Чем Опасен етот код
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.10.10 12:34
Оценка: +1
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, gandjustas, Вы писали:


L>>>Например, часто встречаются ситуации, когда их нужно более одного.


G>>"Часто" это когда?

G>>У меня ни разу такого не было.

L>А у меня были: есть задачи, которые периодически запускаются и работают в фоне, собирая разную статистику, они по смвоей природе длительные и обращаться к полученным данным будут очень нескоро; а есть интерактивные задачи, запускаемые пользователями с интерфейса, они — короткие, и результат жедательно получить тут же. Если будет 1 пул потоков, то дительные задачи его тупо забьют и не дадут выполняться задачам второго типа. 2 пула эту проблему снимают.


Scheduler.NewThread и Scheduler.ThreadPool
И наступит счастье.

Еще раз: не надо программировать в терминах потоков и пулов.
Re[6]: Чем Опасен етот код
От: Lloyd Россия  
Дата: 10.10.10 12:38
Оценка:
Здравствуйте, gandjustas, Вы писали:

L>>А у меня были: есть задачи, которые периодически запускаются и работают в фоне, собирая разную статистику, они по смвоей природе длительные и обращаться к полученным данным будут очень нескоро; а есть интерактивные задачи, запускаемые пользователями с интерфейса, они — короткие, и результат жедательно получить тут же. Если будет 1 пул потоков, то дительные задачи его тупо забьют и не дадут выполняться задачам второго типа. 2 пула эту проблему снимают.


G>Scheduler.NewThread и Scheduler.ThreadPool

G>И наступит счастье.

.Net 4 и счастье помахало ручкой.

G>Еще раз: не надо программировать в терминах потоков и пулов.


Еще раз: никто и не прогрмаммирует в терминах потоков и пулов. Где ты их нашел?
Re[2]: Чем Опасен етот код
От: Аноним  
Дата: 10.10.10 16:08
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Аноним, Вы писали:


L>А вас с какой целью это интересует?

L>Если ради интереса — это одно. А если для работы, то всегда лучше взять готовое, например те же thread-safe коллекции из .net 4: BlockingCollection Overview

Здравствуйте all

как тут написали ,у меня случай когда есть очень много маленьких интерактивных задач
И их надо выполнять асинхронно ,встроенным пулом пользоваться не хочу т.к. он жестко занять WCF
насчет BlockingCollection то в принципе ето тоже самое- (Producer-Consumer) ,с тем плюсом что свой код он ведь както ближе всегда))))
А еще есть 2 готовых самодельных threadpoola :
СТП и ЕТП
но они тяжелые ,особенно первый ,хотя идейки там хорошие
а насчет безопасности то меня тревожила вотета часть
public void QueueWorkItem<T>(Action<T> action, T arg)
        {
            lock (_locker)
            {
                _itemQ.Enqueue(()=>action(arg));            
                Monitor.Pulse(_locker);         
            }
        }

а именно захват локального переменного "арг" анонимным делегатом внутри критической секции
(хотя захват идет во время компиляции...)
но потом в принципе понял что ведь у каждого потока свой стек и локальные переменные именно там и они вроде как только их,хотя кто знает..
конечно могут быть еще проблемы с исключениями ,но предположим что исключений нет))))))
Re[5]: Чем Опасен етот код
От: Tom Россия http://www.RSDN.ru
Дата: 10.10.10 16:18
Оценка:
L>А у меня были: есть задачи, которые периодически запускаются и работают в фоне, собирая разную статистику, они по смвоей природе длительные и обращаться к полученным данным будут очень нескоро; а есть интерактивные задачи, запускаемые пользователями с интерфейса, они — короткие, и результат жедательно получить тут же. Если будет 1 пул потоков, то дительные задачи его тупо забьют и не дадут выполняться задачам второго типа. 2 пула эту проблему снимают.
А что значит забьют пул?
Народная мудрось
всем все никому ничего(с).
Re[6]: Чем Опасен етот код
От: Tom Россия http://www.RSDN.ru
Дата: 10.10.10 16:19
Оценка:
Tom>А что значит забьют пул?

И самое интересное, как второй пул поможет если первый забит
Народная мудрось
всем все никому ничего(с).
Re[7]: Чем Опасен етот код
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.10.10 16:29
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, gandjustas, Вы писали:


L>>>А у меня были: есть задачи, которые периодически запускаются и работают в фоне, собирая разную статистику, они по смвоей природе длительные и обращаться к полученным данным будут очень нескоро; а есть интерактивные задачи, запускаемые пользователями с интерфейса, они — короткие, и результат жедательно получить тут же. Если будет 1 пул потоков, то дительные задачи его тупо забьют и не дадут выполняться задачам второго типа. 2 пула эту проблему снимают.


G>>Scheduler.NewThread и Scheduler.ThreadPool

G>>И наступит счастье.

L>.Net 4 и счастье помахало ручкой.

Rx и на 3.5 работает

G>>Еще раз: не надо программировать в терминах потоков и пулов.

L>Еще раз: никто и не прогрмаммирует в терминах потоков и пулов. Где ты их нашел?
Ну именно в этой теме
Re[7]: Чем Опасен етот код
От: Lloyd Россия  
Дата: 10.10.10 16:30
Оценка: +1
Здравствуйте, Tom, Вы писали:

Tom>>А что значит забьют пул?


Пусть у тебя пул на 10 задач например. Тут пришли 10 тяжелых задач, каждая минут на 15. Все, все потоки из пула заняты, последующие задачи будут ждать 15 минут.

Tom>И самое интересное, как второй пул поможет если первый забит


Второй пул крутит только легкие задачи, поэтому шансы, что задача не встанет в долгую очередь, гораздо выше.
Re[8]: Чем Опасен етот код
От: Lloyd Россия  
Дата: 10.10.10 16:33
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>Scheduler.NewThread и Scheduler.ThreadPool

G>>>И наступит счастье.

L>>.Net 4 и счастье помахало ручкой.

G>Rx и на 3.5 работает

Кто-ж в продакшен будет деплоить экспериментальные либы?

G>>>Еще раз: не надо программировать в терминах потоков и пулов.

L>>Еще раз: никто и не прогрмаммирует в терминах потоков и пулов. Где ты их нашел?
G>Ну именно в этой теме

Тебе показалось.
Re[9]: Чем Опасен етот код
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.10.10 16:46
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, gandjustas, Вы писали:


G>>>>Scheduler.NewThread и Scheduler.ThreadPool

G>>>>И наступит счастье.

L>>>.Net 4 и счастье помахало ручкой.

G>>Rx и на 3.5 работает

L>Кто-ж в продакшен будет деплоить экспериментальные либы?

Я деплоил много раз. Это лучше чем свои велосипеды писать.
Re[10]: Чем Опасен етот код
От: Lloyd Россия  
Дата: 10.10.10 16:50
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>Rx и на 3.5 работает


L>>Кто-ж в продакшен будет деплоить экспериментальные либы?

G>Я деплоил много раз. Это лучше чем свои велосипеды писать.

Ваше право.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.