Пул потоков - 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);
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д