Всем привет. Столкнулся со следующей проблемой.
Прочел вот http://www.rsdn.ru/article/dotnet/CSThreading1.xml про семафор. Цитирую:
Цитата | Semaphore похож на ночной клуб – он имеет определенную вместимость, которую обеспечивает вышибала. После заполнения никто уже не может войти в ночной клуб, очередь образуется снаружи. Далее, если один человек покидает клуб, один из начала очереди может пройти внутрь. Конструктор Semaphore принимает минимум два параметра – число еще доступных мест и общую вместимость ночного клуба.
|
Решил покопать все это. Задачей было примерно следующее:
Цитата | Запустить N потоков и выполнять задачу, как только поток завершает работу, запускается следующий.
|
написал следующее:
Код | using System; using System.Threading;
namespace ThreadTest { class Program { private const int Max = 10;
//10 потоков, после блокируем static Semaphore _sem = new Semaphore(Max, Max); static Random _rnd = new Random(); static int _threadCount;
static void Main(string[] args) { while (true) { if (_threadCount == Max) { _sem.WaitOne(); } new Thread(Task).Start(); } }
static void Task() { try { Interlocked.Increment(ref _threadCount); var i = _rnd.Next(100)*1000; Console.WriteLine("Thread {0} working", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(i); Console.WriteLine("Thread {0} complete. Sleep: {1}", Thread.CurrentThread.ManagedThreadId, i); } finally { Interlocked.Decrement(ref _threadCount); _sem.Release(1); } } } } |
но тут возникла проблема. Потоки создаются друг за другом, примерно это выводится в консоль (совсем не то, что ожидалось):
Цитата | Thread 3 working Thread 4 working Thread 5 working Thread 6 working Thread 7 working Thread 8 working Thread 9 working Thread 10 working Thread 11 working Thread 12 working Thread 13 working Thread 14 working Thread 15 working Thread 16 working Thread 17 working ... Thread 1293 complete. Sleep: 2000 Thread 1305 complete. Sleep: 2000
|
+SemaphoreFullException Добавление указанного счетчика к семафору приведет к превышению максимального значения.
Что не правильно? :( |