Re[2]: Пул потоков
От: zoom-zoom  
Дата: 05.12.11 14:05
Оценка: :))
Здравствуйте, Divineshadow, Вы писали:

D>Тестовое задание для "Связного" делаем?


От Вас ничего не скроешь! Надеюсь Вы не из Связного? ))))
Хотя может лучше и из Связного и поможет поможете с такой задачей. )
Re[5]: Пул потоков
От: Aen Sidhe Россия Просто блог
Дата: 05.12.11 13:32
Оценка: 1 (1)
Здравствуйте, Lloyd, Вы писали:

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


L>>>И что из перечисленого ThreadPool умеете?


AS>>Всё, кроме Stop() из коропки. Всё со стопом с допилом.


L>Научите как пользоваться приоритетами в стандартном ThreadPool-е?


Thread,CurrentThread.Priority = ...
С уважением, Анатолий Попов.
ICQ: 995-908
Re: Пул потоков
От: Divineshadow  
Дата: 05.12.11 13:57
Оценка: :)
Тестовое задание для "Связного" делаем?
Re[11]: Пул потоков
От: Aen Sidhe Россия Просто блог
Дата: 05.12.11 14:04
Оценка: +1
Здравствуйте, zoom-zoom, Вы писали:

L>>>>>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.


AS>>>>Ну это не мне надо, а топикстартеру.


L>>>топикстартеру нужен свой кастомный threadpool, а вы ему предлагаете решение, которое некорректно.


AS>>Судя по всему, топикстартер делает лабу/задание к собеседованию.


ZZ>ВЫ попали в точку!!! Я раньше писал простые Win-приложения на C#, а в данной задаче требуется знания профи.


http://lmgtfy.com/?q=custom+thread+pool+c%23

Вторая ссылка очень подробна.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[6]: [OFF]
От: Аноним  
Дата: 30.01.12 18:12
Оценка: :)
Здравствуйте, Divineshadow, Вы писали:

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


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

HL>>

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

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

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


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

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

Был на собеседовании там сегодня....
Думал, что я слегка выше среднего, но тот парень,собеседовавший меня, реально гений. Или очень близко.
Я не знаю, есть ли у него еще что-то в жизни, кроме программирования, но поверьте, "В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых" — это правда. Я думаю, такой мозг вообще один на миллион рождается. Вообщем, депрессия, бессмысленно прожитые 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
Пул потоков
От: zoom-zoom  
Дата: 05.12.11 13:17
Оценка:
Никогда не работал с потоками, нужна ваша помощь!
Требуется реализация класса на языке C#, аналогичного FixedThreadPool в Java, со следующими требованиями:
* В конструктор этого класса должно передаваться количество потоков, которые будут выполнять задачи.
* Интерфейс класса должен предоставлять методы: boolean execute(Task task, Priority priority) и void stop()
* Интерфейс Task должен содержать один метод: void execute(), который вызывается в произвольном потоке.
* Тип Priority — это перечисление из трёх приоритетов: HIGH, NORMAL, LOW. При этом во время выбора следующего задания из очереди действуют такие правила: на три задачи с приоритетом HIGH выполняется одна задача с приоритетом NORMAL, задачи с приоритетом LOW не выполняются, пока в очереди есть хоть одна задача с другим приоритетом.
* До вызова метода stop() задачи ставятся в очередь на выполнение и метод boolean execute(Task task, Priority priority) сразу же возвращает true, не дожидаясь завершения выполнения задачи; а после вызова stop() новые задачи не добавляются в очередь на выполнение, и метод boolean execute(Task task, Priority priority) сразу же возвращает false.
* Метод stop() ожидает завершения всех текущих задач (не очищая очередь).
Re: Пул потоков
От: Aen Sidhe Россия Просто блог
Дата: 05.12.11 13:22
Оценка:
Здравствуйте, zoom-zoom, Вы писали:

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

ZZ>Требуется реализация класса на языке C#, аналогичного FixedThreadPool в Java, со следующими требованиями:


http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx
С уважением, Анатолий Попов.
ICQ: 995-908
Re[2]: Пул потоков
От: Lloyd Россия  
Дата: 05.12.11 13:24
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

ZZ>>Требуется реализация класса на языке C#, аналогичного FixedThreadPool в Java, со следующими требованиями:


AS>http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx


И что из перечисленого ThreadPool умеете?
Re[3]: Пул потоков
От: Aen Sidhe Россия Просто блог
Дата: 05.12.11 13:28
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


ZZ>>>Требуется реализация класса на языке C#, аналогичного FixedThreadPool в Java, со следующими требованиями:


AS>>http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx


L>И что из перечисленого ThreadPool умеете?


Всё, кроме Stop() из коропки. Всё со стопом с допилом.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[4]: Пул потоков
От: Lloyd Россия  
Дата: 05.12.11 13:30
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

L>>И что из перечисленого ThreadPool умеете?


AS>Всё, кроме Stop() из коропки. Всё со стопом с допилом.


Научите как пользоваться приоритетами в стандартном ThreadPool-е?
Re[6]: Пул потоков
От: Lloyd Россия  
Дата: 05.12.11 13:35
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

L>>Научите как пользоваться приоритетами в стандартном ThreadPool-е?


AS>Thread,CurrentThread.Priority = ...


Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.
А во-вторых, хотелось бы узнать как приведенный код можно применить к поставленной задаче.
Re[7]: Пул потоков
От: Aen Sidhe Россия Просто блог
Дата: 05.12.11 13:42
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


L>>>Научите как пользоваться приоритетами в стандартном ThreadPool-е?


AS>>Thread,CurrentThread.Priority = ...


L>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.


Ну это не мне надо, а топикстартеру.

L>А во-вторых, хотелось бы узнать как приведенный код можно применить к поставленной задаче.


Из WaitCallback вызываем, получаем нужный приоритет. Вуаля.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[7]: Пул потоков
От: zoom-zoom  
Дата: 05.12.11 13:43
Оценка:
Это пока все, что я смог разобрать в задании, не пойму, что нужно написать в Main и как выставлять эти приоритеты?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FixedThreadPool
{
public interface Task
{
void execute();
}
public interface interfaceThreadPool
{
enum Priority
{
HIGH, NORMAL, LOW
}
bool execute(Task task, Priority priority);
void stop();
}
public class ThreadPool : interfaceThreadPool
{
public int countTread = 0;
public ThreadPool(int countTread)
this.countTread = countTread;
}
class Program
{
static void Main(string[] args)
{
}
}
}
Re[8]: Пул потоков
От: Lloyd Россия  
Дата: 05.12.11 13:45
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

L>>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.


AS>Ну это не мне надо, а топикстартеру.


топикстартеру нужен свой кастомный threadpool, а вы ему предлагаете решение, которое некорректно.

L>>А во-вторых, хотелось бы узнать как приведенный код можно применить к поставленной задаче.


AS>Из WaitCallback вызываем, получаем нужный приоритет. Вуаля.


И как это поможет?
На всякий случай напоминаю, что хотел топикстартер: "на три задачи с приоритетом HIGH выполняется одна задача с приоритетом NORMAL".
Re[9]: Пул потоков
От: Aen Sidhe Россия Просто блог
Дата: 05.12.11 13:47
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


L>>>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.


AS>>Ну это не мне надо, а топикстартеру.


L>топикстартеру нужен свой кастомный threadpool, а вы ему предлагаете решение, которое некорректно.


Судя по всему, топикстартер делает лабу/задание к собеседованию.

L>>>А во-вторых, хотелось бы узнать как приведенный код можно применить к поставленной задаче.


AS>>Из WaitCallback вызываем, получаем нужный приоритет. Вуаля.


L>И как это поможет?

L>На всякий случай напоминаю, что хотел топикстартер: "на три задачи с приоритетом HIGH выполняется одна задача с приоритетом NORMAL".

А, гм. Тогда я мудак, да. Не увидел этого требования. Но и тогда это решается семафорами и прочим.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[7]: Пул потоков
От: hardcase Пират http://nemerle.org
Дата: 05.12.11 13:51
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.


А что такого?
using(new ThreadPriorityScope(ThreadPriority.AboveNormal))
{
 ...
}

где ThreadPriorityScope что-то типа:
public sealed class ThreadPriorityScope : IDisposable
{
  public ThreadPriorityScope(ThreadPriority newPriority)
  {
    _originalPriority = Thread.CurrentThread.Priority;
    Thread.CurrentThread.Priority = newPriority;
  }
  
  public void Dispose()
  {
    Thread.CurrentThread.Priority = _originalPriority;
  }
  
  private readonly ThreadPriority _originalPriority;
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[8]: Пул потоков
От: Lloyd Россия  
Дата: 05.12.11 13:52
Оценка:
Здравствуйте, hardcase, Вы писали:

L>>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.


H>А что такого?


А то, что документация не рекомендует.
Re[8]: Пул потоков
От: Lloyd Россия  
Дата: 05.12.11 13:53
Оценка:
Здравствуйте, hardcase, Вы писали:

L>>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.


H>А что такого?


Не говоря уж о том, что это не решает поставленной задачи.
Re[10]: Пул потоков
От: zoom-zoom  
Дата: 05.12.11 14:02
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

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


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


L>>>>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.


AS>>>Ну это не мне надо, а топикстартеру.


L>>топикстартеру нужен свой кастомный threadpool, а вы ему предлагаете решение, которое некорректно.


AS>Судя по всему, топикстартер делает лабу/задание к собеседованию.


ВЫ попали в точку!!! Я раньше писал простые Win-приложения на C#, а в данной задаче требуется знания профи.

L>>>>А во-вторых, хотелось бы узнать как приведенный код можно применить к поставленной задаче.


AS>>>Из WaitCallback вызываем, получаем нужный приоритет. Вуаля.


L>>И как это поможет?

L>>На всякий случай напоминаю, что хотел топикстартер: "на три задачи с приоритетом HIGH выполняется одна задача с приоритетом NORMAL".

AS>А, гм. Тогда я мудак, да. Не увидел этого требования. Но и тогда это решается семафорами и прочим.
Re[3]: Пул потоков
От: Divineshadow  
Дата: 05.12.11 14:40
Оценка:
Здравствуйте, zoom-zoom, Вы писали:

D>>Тестовое задание для "Связного" делаем?

ZZ>От Вас ничего не скроешь! Надеюсь Вы не из Связного? ))))
ZZ>Хотя может лучше и из Связного и поможет поможете с такой задачей. )
Нет не из связного
Тоже делал это задание, но не взяли. Видимо код ревью не прошёл
Хотя мне мой класс тут же пригодился в одной задаче — и он отлично работал.
Что им могло не понравится..
Re[3]: Пул потоков
От: Divineshadow  
Дата: 06.12.11 07:01
Оценка:
Здравствуйте, zoom-zoom, Вы писали:

D>>Тестовое задание для "Связного" делаем?

ZZ>От Вас ничего не скроешь! Надеюсь Вы не из Связного? ))))
ZZ>Хотя может лучше и из Связного и поможет поможете с такой задачей. )

Кстати, для вашего сведения: здесь
Автор: Mike77
Дата: 04.07.11
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[7]: [OFF]
От: Аноним  
Дата: 21.02.12 09:51
Оценка:
Здравствуйте, Аноним, Вы писали:

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


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

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


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

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


Дык вас собеседовали, или хвастались перед вами своим мозогом?
Re[8]: [OFF]
От: IObserver Ниоткуда  
Дата: 22.02.12 10:20
Оценка:
Здравствуйте, AndrewVK, Вы писали:

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


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