2014-01-17 3 views
1

Я использую Parallel.ForEach для большого количества заданий.Parallel.ForEach, как проверить процесс?

Я хочу знать, как идет процесс.

Так в настоящее время я писал:

int processCnt=0; 
Parallel.ForEach(allJobs, myPallOption, (oneJob) => 
    { 
     processCnt++; 
     Console.WriteLine("Job#"+processCnt+"/"+totalCnt); 
     doJob(oneJob); 
    } 

Но я думаю, что processCnt++; будет заблокирован каким-то образом, и это не может быть хорошей идеей. Это может замедлить процесс.

Итак, есть ли лучший способ узнать, сколько работ уже выполнено?

Меня не волнует точность processCnt, Я просто хочу более высокую скорость. Я думаю, что processCnt++ может иметь более низкую производительность.

ответ

0

Как насчет делать:

int processCnt=0; 
Parallel.ForEach(allJobs, myPallOption, (oneJob) => 
    { 
     var currentCount = Interlocked.Increment(ref processCnt); 
     Console.WriteLine("Job#"+currentCount+"/"+totalCnt); 
     doJob(oneJob); 
    } 

Имея локальную переменную «CURRENTCOUNT» Вы уверены, что «processCnt» не будет изменен между локальным приращением и писать его утешать.

0

Заменить processCnt++; с Interlocked.Increment(ref processCnt);

Вам не нужно присвоить результат другой переменной из-за использования [см].

0

Чтобы конкретно задать вопрос: оператор ++ не предназначен для потокобезопасности, поэтому нет никакой дополнительной стоимости. Однако это приведет к неправильным результатам. Interlocked.Increment (как предложено в других ответах) лучше, это правильно, и если это все еще не очень дорого. Путь дешевле, чем фактический замок.

Interlocked.Increment дешево, потому что он может быть реализован с использованием специальной инструкции процессора, которая замораживает все остальные ядра на время этой команды.

+0

Будет ли downvoter объяснять, что я сказал не так? –

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