2016-12-05 3 views
5

У меня есть простой цикл для:Использование многоядерных (-thread) процессор для цикл

for (int i = 1; i <= 8; i++) 
{ 
    DoSomething(i); 
} 
int nopt = 8; //number of processor threads 

Я хотел бы сделать DoSomething(1) в процессоре потока 1,
DoSomething(2) в потоке 2
...
DoSomething(8) в резьбе 8.

Возможно ли это? Если да, то как?

Спасибо за ответы.

+3

Почему вы хотите жестко закодировать нити? Почему вы не используете 'Parallel.For'? –

+1

Вы проверили 'Parallel'? –

ответ

11

Вы можете попробовать Parallel.For:

int nopt = 8; 

    ParallelOptions po = new ParallelOptions() { 
    MaxDegreeOfParallelism = nopt, 
    }; 

    // 9 is exclusive when you want i <= 8 
    Parallel.For(1, 9, po, i => DoSomething(i)); 

PLINQ (Parallel Linq) альтернатива:

Enumerable 
    .Range(1, 8) 
    .AsParallel() 
    .WithDegreeOfParallelism(nopt) 
    .ForAll(i => DoSomething(i)); 
+0

Спасибо, Дмитрий, мне было интересно, есть ли другой метод, чем Parallel.For loop. –

+0

@Monna L: * PLinq * может быть удобно, когда вы * играете * с параллелизмом: очень легко добавить варианты, например. '.WithExecutionMode (ParallelExecutionMode.ForceParallelism)' переключитесь обратно в последовательный режим '.AsSequential()' и т. Д. –

+0

@MonnaL вы можете использовать потоки, но его гораздо сложнее, чем пример паралилизма выше – cichy

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