Re: Пул потоков
От: romangr Россия  
Дата: 06.12.11 09:43
Оценка:
Здравствуйте, zoom-zoom, Вы писали:

ZZ>Никогда не работал с потоками, нужна ваша помощь!

ZZ>Требуется реализация класса на языке C#, аналогичного FixedThreadPool в Java, со следующими требованиями:
ZZ>* В конструктор этого класса должно передаваться количество потоков, которые будут выполнять задачи.
ZZ>* Интерфейс класса должен предоставлять методы: boolean execute(Task task, Priority priority) и void stop()
ZZ>* Интерфейс Task должен содержать один метод: void execute(), который вызывается в произвольном потоке.
ZZ>* Тип Priority — это перечисление из трёх приоритетов: HIGH, NORMAL, LOW. При этом во время выбора следующего задания из очереди действуют такие правила: на три задачи с приоритетом HIGH выполняется одна задача с приоритетом NORMAL, задачи с приоритетом LOW не выполняются, пока в очереди есть хоть одна задача с другим приоритетом.
ZZ>* До вызова метода stop() задачи ставятся в очередь на выполнение и метод boolean execute(Task task, Priority priority) сразу же возвращает true, не дожидаясь завершения выполнения задачи; а после вызова stop() новые задачи не добавляются в очередь на выполнение, и метод boolean execute(Task task, Priority priority) сразу же возвращает false.
ZZ>* Метод stop() ожидает завершения всех текущих задач (не очищая очередь).

Ну вот за полчаса накидал (quick and dirty):

using System;
using System.Collections.Generic;
using System.Threading;

namespace Test
{
    public enum Priority
    {
        Low,
        Normal,
        High
    }
    
    public interface ITask
    {
        void Execute();
    }
    
    public class FixedThreadPool
    {
        private const int THRESHOLD = 3;
        private readonly Thread[] _threads;
        private readonly Queue<ITask> _lowTasks = new Queue<ITask>();
        private readonly Queue<ITask> _normalTasks = new Queue<ITask>();
        private readonly Queue<ITask> _highTasks = new Queue<ITask>();
        private readonly object _lock = new object();
        private int _highTasksTaken;
        private bool _stopped;
        
        public FixedThreadPool(int threadCount)
        {
            _threads = new Thread[threadCount];
            for (int i = 0; i < _threads.Length; i++)
            {
                var thread = new Thread(WorkerThreadProc);
                _threads[i] = thread;
                thread.Start();
            }
        }

        public bool Execute(ITask task, Priority priority)
        {
            lock (_lock)
            {
                if (_stopped)
                {
                    return false;
                }
                if (priority == Priority.High)
                {
                    _highTasks.Enqueue(task);
                }
                else if (priority == Priority.Normal)
                {
                    _normalTasks.Enqueue(task);
                }
                else
                {
                    _lowTasks.Enqueue(task);
                }
                Monitor.Pulse(_lock);
            }
            return true;
        }

        public void Stop()
        {
            lock (_lock)
            {
                if (_stopped)
                {
                    return;
                }
                _stopped = true;
                Monitor.PulseAll(_lock);
            }
            foreach (var thread in _threads)
            {
                thread.Join();
            }
        }

        private void WorkerThreadProc()
        {
            ITask currentTask;
            while (true)
            {
                lock(_lock)
                {
                    currentTask = GetTaskToExecute();
                    while (currentTask == null && !_stopped)
                    {
                        Monitor.Wait(_lock);
                        currentTask = GetTaskToExecute();
                    }
                    if (currentTask == null && _stopped)
                    {
                        return;
                    }
                }
                currentTask.Execute();
            }
        }

        private ITask GetTaskToExecute()
        {
            if (_highTasks.Count > 0 && (_highTasksTaken < THRESHOLD || _normalTasks.Count == 0))
            {
                _highTasksTaken++;
                if (_highTasksTaken > THRESHOLD)
                {
                    _highTasksTaken = THRESHOLD;
                }
                return _highTasks.Dequeue();
            }
            else if (_normalTasks.Count > 0)
            {
                _highTasksTaken = 0;
                return _normalTasks.Dequeue();
            }
            else if (_lowTasks.Count > 0)
            {
                return _lowTasks.Dequeue();
            }
            return null;
        }
    }
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[4]: [OFF]
От: HowardLovekraft  
Дата: 06.12.11 10:02
Оценка:
Здравствуйте, Divineshadow, Вы писали:

В свете этих задач:

Оба проекта являются клиент-серверными решениями и будут иметь более 5000 инсталляций фронта для продавцов на кассах, 100 инсталляций бэкофиса для бизнеса в офисе, 2-3 инсталляции серверной части

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

А после вот этого заявления:

Все программисты решают все задачи: серверный код, GUI, работа с БД, интеграция с внешними системами, разработка юнит тестов, и так далее

слабо верится вот в это:

В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых


От самоуверенности последнего абзаца я плакалЪ.
Re[5]: [OFF]
От: Divineshadow  
Дата: 06.12.11 12:51
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>А после вот этого заявления:

HL>

HL>Все программисты решают все задачи: серверный код, GUI, работа с БД, интеграция с внешними системами, разработка юнит тестов, и так далее

HL>слабо верится вот в это:
HL>

HL>В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых


HL>От самоуверенности последнего абзаца я плакалЪ.

Чувствуется там полный финиш
Re[6]: [OFF]
От: Аноним  
Дата: 30.01.12 18:05
Оценка:
Здравствуйте, Divineshadow, Вы писали:

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


HL>>А после вот этого заявления:

HL>>

HL>>Все программисты решают все задачи: серверный код, GUI, работа с БД, интеграция с внешними системами, разработка юнит тестов, и так далее

HL>>слабо верится вот в это:
HL>>

HL>>В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых


HL>>От самоуверенности последнего абзаца я плакалЪ.

D>Чувствуется там полный финиш
Re[6]: [OFF]
От: Аноним  
Дата: 30.01.12 18:12
Оценка: :)
Здравствуйте, Divineshadow, Вы писали:

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


HL>>А после вот этого заявления:

HL>>

HL>>Все программисты решают все задачи: серверный код, GUI, работа с БД, интеграция с внешними системами, разработка юнит тестов, и так далее

HL>>слабо верится вот в это:
HL>>

HL>>В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых


HL>>От самоуверенности последнего абзаца я плакалЪ.

D>Чувствуется там полный финиш

Был на собеседовании там сегодня....
Думал, что я слегка выше среднего, но тот парень,собеседовавший меня, реально гений. Или очень близко.
Я не знаю, есть ли у него еще что-то в жизни, кроме программирования, но поверьте, "В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых" — это правда. Я думаю, такой мозг вообще один на миллион рождается. Вообщем, депрессия, бессмысленно прожитые 28 лет... Он реально мощный, этот мозг
Re[7]: [OFF]
От: Аноним  
Дата: 21.02.12 09:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Был на собеседовании там сегодня....


О чем спрашивали то?
Re[7]: [OFF]
От: IObserver Ниоткуда  
Дата: 21.02.12 21:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>но поверьте, "В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых" — это правда.


А вы откуда знаете правда или нет? Проверили?

А>Я думаю, такой мозг вообще один на миллион рождается. Вообщем, депрессия, бессмысленно прожитые 28 лет... Он реально мощный, этот мозг


Дык вас собеседовали, или хвастались перед вами своим мозогом?
Re[7]: [OFF]
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 21.02.12 23:12
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых" — это правда


Сдается мне, он просто молодой еще слишком
... << RSDN@Home 1.2.0 alpha 5 rev. 21 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[8]: [OFF]
От: IObserver Ниоткуда  
Дата: 22.02.12 10:20
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Сдается мне, он просто молодой еще слишком


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