Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Aen Sidhe, Вы писали:
L>>>И что из перечисленого ThreadPool умеете?
AS>>Всё, кроме Stop() из коропки. Всё со стопом с допилом.
L>Научите как пользоваться приоритетами в стандартном ThreadPool-е?
Здравствуйте, zoom-zoom, Вы писали:
L>>>>>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.
AS>>>>Ну это не мне надо, а топикстартеру.
L>>>топикстартеру нужен свой кастомный threadpool, а вы ему предлагаете решение, которое некорректно.
AS>>Судя по всему, топикстартер делает лабу/задание к собеседованию.
ZZ>ВЫ попали в точку!!! Я раньше писал простые Win-приложения на C#, а в данной задаче требуется знания профи.
Здравствуйте, Divineshadow, Вы писали:
D>Здравствуйте, HowardLovekraft, Вы писали:
HL>>А после вот этого заявления: HL>>
HL>>Все программисты решают все задачи: серверный код, GUI, работа с БД, интеграция с внешними системами, разработка юнит тестов, и так далее
HL>>слабо верится вот в это: HL>>
HL>>В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых
HL>>От самоуверенности последнего абзаца я плакалЪ. D>Чувствуется там полный финиш
Был на собеседовании там сегодня....
Думал, что я слегка выше среднего, но тот парень,собеседовавший меня, реально гений. Или очень близко.
Я не знаю, есть ли у него еще что-то в жизни, кроме программирования, но поверьте, "В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых" — это правда. Я думаю, такой мозг вообще один на миллион рождается. Вообщем, депрессия, бессмысленно прожитые 28 лет... Он реально мощный, этот мозг
Здравствуйте, <Аноним>, Вы писали:
А>В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых" — это правда
Сдается мне, он просто молодой еще слишком
... << RSDN@Home 1.2.0 alpha 5 rev. 21 on Windows 7 6.1.7601.65536>>
Никогда не работал с потоками, нужна ваша помощь!
Требуется реализация класса на языке 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() ожидает завершения всех текущих задач (не очищая очередь).
Здравствуйте, zoom-zoom, Вы писали:
ZZ>Никогда не работал с потоками, нужна ваша помощь! ZZ>Требуется реализация класса на языке C#, аналогичного FixedThreadPool в Java, со следующими требованиями:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Aen Sidhe, Вы писали:
ZZ>>>Требуется реализация класса на языке C#, аналогичного FixedThreadPool в Java, со следующими требованиями:
AS>>http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx
L>И что из перечисленого ThreadPool умеете?
Всё, кроме Stop() из коропки. Всё со стопом с допилом.
Здравствуйте, Aen Sidhe, Вы писали:
L>>Научите как пользоваться приоритетами в стандартном ThreadPool-е?
AS>Thread,CurrentThread.Priority = ...
Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.
А во-вторых, хотелось бы узнать как приведенный код можно применить к поставленной задаче.
Здравствуйте, Aen Sidhe, Вы писали:
L>>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.
AS>Ну это не мне надо, а топикстартеру.
топикстартеру нужен свой кастомный threadpool, а вы ему предлагаете решение, которое некорректно.
L>>А во-вторых, хотелось бы узнать как приведенный код можно применить к поставленной задаче.
AS>Из WaitCallback вызываем, получаем нужный приоритет. Вуаля.
И как это поможет?
На всякий случай напоминаю, что хотел топикстартер: "на три задачи с приоритетом HIGH выполняется одна задача с приоритетом NORMAL".
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Aen Sidhe, Вы писали:
L>>>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.
AS>>Ну это не мне надо, а топикстартеру.
L>топикстартеру нужен свой кастомный threadpool, а вы ему предлагаете решение, которое некорректно.
Судя по всему, топикстартер делает лабу/задание к собеседованию.
L>>>А во-вторых, хотелось бы узнать как приведенный код можно применить к поставленной задаче.
AS>>Из WaitCallback вызываем, получаем нужный приоритет. Вуаля.
L>И как это поможет? L>На всякий случай напоминаю, что хотел топикстартер: "на три задачи с приоритетом HIGH выполняется одна задача с приоритетом NORMAL".
А, гм. Тогда я мудак, да. Не увидел этого требования. Но и тогда это решается семафорами и прочим.
Здравствуйте, Aen Sidhe, Вы писали:
AS>Здравствуйте, Lloyd, Вы писали:
L>>Здравствуйте, Aen Sidhe, Вы писали:
L>>>>Во-первых, менять приоритеты потоков threadpool-а — это, гм, дурной тон.
AS>>>Ну это не мне надо, а топикстартеру.
L>>топикстартеру нужен свой кастомный threadpool, а вы ему предлагаете решение, которое некорректно.
AS>Судя по всему, топикстартер делает лабу/задание к собеседованию.
ВЫ попали в точку!!! Я раньше писал простые Win-приложения на C#, а в данной задаче требуется знания профи.
L>>>>А во-вторых, хотелось бы узнать как приведенный код можно применить к поставленной задаче.
AS>>>Из WaitCallback вызываем, получаем нужный приоритет. Вуаля.
L>>И как это поможет? L>>На всякий случай напоминаю, что хотел топикстартер: "на три задачи с приоритетом HIGH выполняется одна задача с приоритетом NORMAL".
AS>А, гм. Тогда я мудак, да. Не увидел этого требования. Но и тогда это решается семафорами и прочим.
Здравствуйте, zoom-zoom, Вы писали:
D>>Тестовое задание для "Связного" делаем? ZZ>От Вас ничего не скроешь! Надеюсь Вы не из Связного? )))) ZZ>Хотя может лучше и из Связного и поможет поможете с такой задачей. )
Нет не из связного
Тоже делал это задание, но не взяли. Видимо код ревью не прошёл
Хотя мне мой класс тут же пригодился в одной задаче — и он отлично работал.
Что им могло не понравится..
Здравствуйте, zoom-zoom, Вы писали:
D>>Тестовое задание для "Связного" делаем? ZZ>От Вас ничего не скроешь! Надеюсь Вы не из Связного? )))) ZZ>Хотя может лучше и из Связного и поможет поможете с такой задачей. )
Здравствуйте, 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;
}
}
}
Оба проекта являются клиент-серверными решениями и будут иметь более 5000 инсталляций фронта для продавцов на кассах, 100 инсталляций бэкофиса для бизнеса в офисе, 2-3 инсталляции серверной части
написание человеком своего пула потоков кажется особенно полезным, ага.
А после вот этого заявления:
Все программисты решают все задачи: серверный код, GUI, работа с БД, интеграция с внешними системами, разработка юнит тестов, и так далее
слабо верится вот в это:
В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых
Здравствуйте, 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
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Был на собеседовании там сегодня....
Здравствуйте, Аноним, Вы писали:
А>но поверьте, "В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых" — это правда.
А вы откуда знаете правда или нет? Проверили?
А>Я думаю, такой мозг вообще один на миллион рождается. Вообщем, депрессия, бессмысленно прожитые 28 лет... Он реально мощный, этот мозг
Дык вас собеседовали, или хвастались перед вами своим мозогом?