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

多线程可重入问题分享

时间:2023-04-10 14:58:54 C#

多线程可重入问题我正在尝试为某些处理生成不同的线程。我为每个线程中的某些逻辑使用for循环索引。如何让不同的线程在下面的代码中打印1,2,3,4,5?每次运行此程序时,我都会得到不同的数字作为输出-3、3、3、4、6、6和2、2、3、5、5、6等。我尝试使用锁定对象,但没有成功做对了。谁能帮我解决这个问题。我只想确保每个线程/任务都获得正确的索引。请注意,每个任务都被迫在单独的线程上运行。列出任务1=newList();for(intj=1;j{Console.WriteLine(j);},newCancellationToken(),TaskCreationOptions.LongRunning,TaskScheduler.Default));}Task.WaitAll(tasks1.ToArray());控制台.Read();您正在“捕获循环变量”。j在lambda中使用的事实意味着编译器将以不同方式对待它(本质上,它将被装箱)并且所有线程将使用相同的共享变量。简短修复:for(intj=1;j{Console.WriteLine(jCopy);},newCancellationToken(),TaskCreationOptions.LongRunning,TaskScheduler.Default));只是为了完成其他答案。在C#5.0(.NET4.5)中,关闭foreach循环变量发生了重大变化,但没有关闭for循环变量。有关详细信息(和前言更新说明),请参阅EricLippert。关闭循环变量被认为是有害的,他的Closingovertheloopvariable,part2请注意,这个问题与多线程或TPL(任务并行库)的使用无关。其他答案和评论提到之前已经讨论过,但不要链接到任何以前的答案。这里有一些,用于链接:回答了数百万次。它与关闭有关。如下更改代码for(intj=1;j{Console.WriteLine(temp);},newCancellationToken(),TaskCreationOptions.LongRunning,TaskScheduler.Default));}推荐阅读:上面的LoopVariablesandClosures是C#学习教程:多线程重入问题分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: