当前位置: 首页 > 编程语言 > C#

使用NestedParallel.For分享

时间:2023-04-11 11:18:25 C#

使用NestedParallel.For考虑这个例子:varx=0;对于(vari=0;i<100;i++){for(vara=i+1;a<100;a++)x+=1;打印x时,我们总是得到4950。如果我将其并行化怎么办?这就是我想出的Parallel.For(0,100,i=>Parallel.For(i+1,100,a=>{x+=1;}));但是,它不会在我每次运行时都打印4950。为什么?ParallelExtensions可帮助您以近乎急切的语法创建任务、分配、运行和集合。它不做的是处理各种线程安全(问题之一)。您正在尝试让并行线程同时更新单个共享变量。要正确地做这样的事情,你必须介绍例如锁定。我不确定你想做什么。我假设您的代码只是一个占位符或实验。只有当您可以隔离不同的作业时,并行化才是好的;当您经常需要与共享数据会面时则不会。这将是“正确”的方式,这不需要您锁定最终的总对象,它只需要您在每个线程本机循环的末尾进行互锁。整数x=0;平行线。For(0,100,()=>0,//LocalInit(i,loopstate,outerlocal)=>{Parallel.For(i+1,100,()=>0,//LocalInit(a,loopState,innerLocal)=>{returninnerLocal+1;},(innerLocal)=>Interlocked.Add(refouterlocal,innerLocal));//LocalFinalreturnouterlocal;},(outerLocal)=>Interlocked.Add(refx,outerLocal));//LocalFinal但是,让两个嵌套的Parallel语句做的工作很少可能不是一个好主意。需要考虑间接成本,如果您只做这么少量的工作,最好只做一个Parallel语句,或者什么都不做。我强烈建议您下载并阅读PatternsofParallelProgramming,其中详细说明了为什么这么小的嵌套并行循环不是一个好主意。作为每次都加锁的替代方案,可以将线程局部变量与锁结合起来:以上就是C#学习教程的全部内容:使用嵌套Parallel。供大家分享,如果对大家有用还需要进一步了解C#希望大家多多关注教程——ObjectthisLock=newObject();var全局总和=0;System.Threading.Tasks.Parallel.For(0,100,i=>{System.Threading.Tasks.Parallel.For(i+1,100,()=>0,(num,loopState,subSum)=>++subSum,subSum=>{lock(thisLock){globalSum+=subSum;}});});Console.WriteLine(globalSum);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢