Parallel.For 迭代中的不同线程亲和性
问题具有误导性,因为它基于Parallel
API 意味着多线程的假设。Parallel
API 确实引用了数据并行处理,但不为调用提供任何保证multiple threads
,尤其是对于上面提供的代码,每个线程几乎没有任何工作。
对于Parallel
API,您可以设置 Max degree of Parallelism,如下所示:
ParallelOptions parallelOption = new ParallelOptions();
parallelOption.MaxDegreeOfParallelism = Environment.ProcessorCount;
Parallel.For(0, 20, parallelOption, i =>
但这永远不能保证将被调用到并行处理的线程数,因为线程是在运行时使用的,ThreadPool
并CLR
在运行时根据要处理的工作量决定是否超过one thread
处理所需的数量。
在同一个Parallel
循环中,您可以尝试以下 print 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
表示什么,您是否真的拥有具有这么多处理器的服务器。
编辑:
尝试对您的程序进行以下编辑(基于打印两个线程 id 的事实),现在当两个线程都在图片中时,它们都获得相同的值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);
});