Пул потоков - C#
Формулировка задачи:
Здравствуйте. Допустим, у нас есть массив из 1000 элементов и n потоков, которые должны обработать этот массив, но каждый поток должен обработать только один элемент массива, т.е. 1-ый поток обработал 1-ый элемент, 2-ой поток обработал 2-ой, ... , n-ый поток обработал n-ый элемент и т.д, пока не будут обработана вся эта тысяча элементов. В Java есть замечательный ExecutorService, который как раз подошел бы под мои нужды. Погуглил, нашел что-то похожее - ThreadPool. Попробовал и как-то не удачно. Получается, что локер будет позволять обрабатывать массив только одному потоку, что вроде как не является многопоточностью. Знатоки, как быть? Заранее благодарен.
static int iterat = 0; static int iter = 0; static object workerLocker = new object(); static void Main(string[] args) { iterat = list.Count; for (int i = 0; i < iterat; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc)); ThreadPool.SetMinThreads(10, 10); ThreadPool.SetMaxThreads(10, 10); } lock (workerLocker) while (iter < iterat) Monitor.Wait(workerLocker); } static void ThreadProc(Object stateInfo) { lock (workerLocker) { if (iter < list.Count) { string str = list[iter]; if (str != "") { Console.WriteLine(str); } } iter++; Monitor.Pulse(workerLocker); } } }
Решение задачи: «Пул потоков»
textual
Листинг программы
static void ThreadProc(Object stateInfo) { string str = (string)stateInfo; if (str != "") { Console.WriteLine(str); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д