2016-10-23 2 views
-3

Раньше я использовал следующий код:Лучший способ запустить 200 потоков в C#

for (int i = 0; i < config.threads; i++) 
{ 
    Thread thread = new Thread(workThread); 
    thread.IsBackground = true; 
    thread.Start(); 
} 

public static void workThread() 
{ 
    while (true) 
    { 
     // work, 10 second 
    } 
} 

Он отлично работает, но после 10-15 циклов, начинает работать меньше. Тогда я написал класс для создания отдельных нитей:

class ThreadsPool 
{ 
    private static int maxThreads = 0; 
    private static Thread[] threadsArray; 
    private static int activeThread = 0; 


    public static void Initializer(int maxThreads) 
    { 
     ThreadsPool.maxThreads = maxThreads; 
     for (int i = 0; i < maxThreads; i++) 
     { 
      Thread thread = new Thread(Program.workThread); 
      thread.IsBackground = true; 
      thread.Start(); 
     } 
     Thread threadDaemon = new Thread(Daemon); 
     threadDaemon.IsBackground = true; 
     threadDaemon.Start(); 
    } 

    public static void activeThreadMinus() 
    { 
     Interlocked.Decrement(ref activeThread); 
    } 

    private static void Daemon() 
    { 
     while(true) 
     { 
      if(activeThread < maxThreads) 
      { 
       Thread thread = new Thread(Program.workThread); 
       thread.IsBackground = true; 
       thread.Start(); 
      } 
      Thread.Sleep(5); 
     } 
    } 

public static void workThread() 
     { 
      while (true) 
      { 
       // work 10 sec 
       ThreadsPool.activeThreadMinus(); 
      } 
     } 
} 

Но проблема в том, что этот класс создает утечку памяти. Вы понимаете, что мне приходится делать 10 секунд, почти бесконечное количество раз, иногда число запущенных потоков меняется. Как это можно сделать без утечек памяти и без потери производительности.

+2

Сначала, что вы делаете, вам нужно до 200 потоков? Я думаю, что это проблема дизайна. Вы всегда будете получать проблемы с производительностью, если у вас есть 200 потоков. Никакой Prozessor не может справиться с этим быстро. – Sebi

+0

Мне нужно обработать изображение. Я знаю, что потоки 200 не невозможны. – SavaLLL

+7

Не ломайте 200 нитей. Разбить количество потоков, равное количеству ядер ЦП. –

ответ

0

Создайте очередь и получите столько потоков, сколько числа процессоров. Затем сделайте потоки прочитанными из очереди и обработайте сообщения. Не уничтожайте нити, пусть они бегут бесконечно.

Смежные вопросы