ThreadPool - не все потоки учитываются при использовании в цикле - C#
Формулировка задачи:
При выполнении ThreadPool в цикле, после определённого количества циклов он зависает на строке 17(Monitor.Wait(workerLocker).
Точнее зависания как такового нет, он просто ждёт workerLocker, но не получает его. При этом runningWorkers = 1 (или2), где runningWorkers косвенно указывает на количество работающих потоков, которые должны бы были освободить workerLocker, но судя по всему они как то пропадают
Подскажите пожалуйста более надёжный способ выяснить, есть ли рабочие потоки в ThreadPool (и их количество), или, как решить вопрос с "пропадающими потоками" при использовании в цикле.
class Program { static object workerLocker = new object(); static int runningWorkers = 10; static int counter = 0; public static void Main() { for (int j = 0; j < 1000000; j++) { runningWorkers = 10; for (int i = 0; i < runningWorkers; i++) ThreadPool.QueueUserWorkItem(Go, i); lock (workerLocker) while (runningWorkers > 0) Monitor.Wait(workerLocker); } Console.WriteLine("Готово! " + "Потоки выполнялись " + counter + " раз"); Console.ReadLine(); } public static void Go(object instance) { lock (workerLocker) { counter++; runningWorkers--; Monitor.Pulse(workerLocker); } } }
Решение задачи: «ThreadPool - не все потоки учитываются при использовании в цикле»
textual
Листинг программы
int[] a = {1, 2, 3}; int sum = a.AsParallel().Aggregate(() => 0, (x, y) => x + y, (x, y) => x + y, i => i);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д