Различное сходство потоков в Parallel.For Iterations
Вопрос вводит в заблуждение, поскольку он основан на предположении, что Parallel
API означает несколько потоков. Parallel
API ссылается на параллельную обработку данных, но не дает никаких гарантий для вызова multiple threads
, особенно для приведенного выше кода, где едва ли выполняется какая-либо работа в каждом потоке.
Для Parallel
API вы можете установить максимальную степень параллелизма следующим образом:
ParallelOptions parallelOption = new ParallelOptions();
parallelOption.MaxDegreeOfParallelism = Environment.ProcessorCount;
Parallel.For(0, 20, parallelOption, i =>
Но это никогда не гарантирует количество потоков, которые будут вызываться для параллельной обработки, поскольку потоки используются из ThreadPool
, а CLR
решает во время выполнения в зависимости от объема обрабатываемой работы, требуется ли для обработки больше one thread
.
В том же цикле Parallel
вы можете попробовать следующее: напечатайте Thread.Current.ManageThreadId
, это даст четкое представление о количестве потоков, вызываемых в цикле Parallel
.
Нужно ли явно использовать потоки и устанавливать привязки только один раз?
Изменить: я пробовал версию с резьбой, происходит то же самое. Даже с явными двумя потоками, оба пишут 255 на консоль. Теперь кажется, что эта команда предназначена для процесса, а не для потока.
Можете ли вы опубликовать код для нескольких потоков, можете ли вы попробовать что-то вроде этого.
Thread[] threadArray = new Thread[2];
threadArray[0] = new Thread(<ThreadDelegate>);
threadArray[1] = new Thread(<ThreadDelegate>);
threadArray[0]. ProcessorAffinity = <Set Processor Affinity>
threadArray[1]. ProcessorAffinity = <Set Processor Affinity>
Предполагая, что вы правильно назначили сходство, вы можете распечатать их и найти разные значения, проверьте следующее ProcessThread.ProcessorAffinity.
С другой стороны, как вы могли видеть в приведенной выше ссылке, вы можете установить значение в hexadecimal
на основе сходства процессоров, не уверен, что означают значения 254, 255
, действительно ли у вас есть сервер с таким количеством процессоров.
ИЗМЕНИТЬ:
Попробуйте следующее редактирование вашей программы (на основе того факта, что два идентификатора потока распечатываются), теперь, когда оба потока находятся на картинке, они оба получают одинаковое значение variable i
, им нужно local variable
, чтобы избежать проблемы с закрытием
Parallel.For(0,2,i=>{
int local = i;
if(local=0)
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)(255);
if(local==1)
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)(254);
Thread.Sleep(25);// to make sure both set their affinities
Console.WriteLine(Process.GetCurrentProcess().ProcessorAffinity);
});
РЕДАКТИРОВАТЬ 2: (чаще всего не работает, так как оба потока могут увеличиваться до фактического выполнения логики)
int local = -1;
Parallel.For(0,2,i=>{
Interlocked.Increment(ref local);
if(local=0)
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)(255);
if(local==1)
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)(254);
Thread.Sleep(25);// to make sure both set their affinities
Console.WriteLine(Process.GetCurrentProcess().ProcessorAffinity);
});
person
Mrinal Kamboj
schedule
16.09.2016