【发布时间】:2015-12-04 18:36:33
【问题描述】:
我想将测试分布在多个线程上,因此首先我将要测试的总数除以我想要的线程数量(包括余数)。然后我将测试范围内的数字分配给每个线程。每次测试结果为阳性时,计数器都会增加。我在 0 到 123 的范围内对其进行测试,因为我知道结果应该是什么,但是每当我为任务分配超过 1 个线程时,我都会得到错误的结果。调试时,我注意到线程启动后,当前行跳回分配新线程。我不明白为什么。我有一个锁保护柜台,据我所知,它工作正常。下面是对应的代码:
for (int n = 0; n < remainder; n++)
{
workers[n] = new Thread(() => CountNumbers(startvalue + n * (tasks + 1), startvalue + (n + 1) * (tasks + 1), modulus));
}
for (int m = remainder; m < nrthreads; m++)
{
workers[m] = new Thread(() => CountNumbers(startvalue + remainder * (tasks + 1) + (m - remainder) * tasks, startvalue + remainder * (tasks + 1) + (m - remainder + 1) * tasks, modulus));
}
for (int k = 0; k < nrthreads; k++)
{
workers[k].Start();
}
for (int k = 0; k < nrthreads; k++)
{
workers[k].Join();
}
当workers[k].Start() 完成所有 k 时,就会出现“问题”,然后它出于某种原因覆盖了workers 中的最后一个线程。
我对 C# 比较陌生,所以我很难找到缺陷。这是给学校的,所以正确方向的提示可能比干净的答案更合适。
【问题讨论】:
-
您是否考虑过使用 Parallels.For 或 ForEach 循环而不是自己完成所有“艰苦”的工作?
-
我没有,主要是因为我对自己的数学部分有信心,而对可用的更高级循环则不太有信心。我想它会清理一下代码。
标签: c# .net multithreading