2013-11-10 3 views
6

Я новичок в многопоточности. У меня есть 4 логических процесса на моем компьютере, и я хочу запустить 4 равные задачи в потоках на 4 разных ядрах. Как мне это сделать? Я попытался использовать BackgroundWorker, но 4 экземпляра BackgroundWorker заполняют только 2 ядра из 4 доступных. Мой пример кода с BackgroundWorker'S:Как разделить длинные задачи на разных ядрах?

 BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
     worker.RunWorkerAsync(calculationParams); 
     BackgroundWorker worker1 = new BackgroundWorker(); 
     worker1.DoWork += new DoWorkEventHandler(worker_DoWork); 
     worker1.RunWorkerAsync(calculationParams1); 

     BackgroundWorker worker2 = new BackgroundWorker(); 
     worker2.DoWork += new DoWorkEventHandler(worker_DoWork); 
     worker2.RunWorkerAsync(calculationParams2); 

     BackgroundWorker worker3 = new BackgroundWorker(); 
     worker3.DoWork += new DoWorkEventHandler(worker_DoWork); 
     worker3.RunWorkerAsync(calculationParams3); 
+1

Почему важно, чтобы ваши функции запускались на разных ядрах? –

+0

@ JensKloster имеет хорошую точку. Пусть .NET управляет оптимальным распределением потоков для вас. –

+2

В одном из ответов Игоря говорится: 'TPL масштабирует степень параллелизма динамически, чтобы эффективно использовать все доступные ядра. Используя TPL, вы можете максимизировать производительность своего кода, сосредоточившись на работе, которую ваша программа предназначена для выполнения. –

ответ

3

Вы можете установить соответствие процессоров для задачи, если вы используете задачи. Обратите внимание на следующее сообщение: Force Task<T> to different core ?.

Я не думаю, что вы можете сделать это с помощью BackgroundWorker. Вы должны использовать либо потоки, либо задачи.

Другое сообщение, которое может показаться вам интересным: Multi core programming using Task Parallel Library with .NET 4.0.

0

Причина может быть в вашем названии logical processes. Например, если у вас есть hyperthreading on, использование дополнительных логических (но не физически) ядер может не дать преимущества

+0

У меня есть «hyperthreading on» на моем компьютере, и теперь, когда я выполняю выполнение задач statring, все 4 ядра, но <= 50%. Это действительно странно – Frank59

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