gpt4 book ai didi

c# - 我的多线程创建或覆盖了一个额外的/现有的线程

转载 作者:行者123 更新时间:2023-11-30 21:53:13 25 4
gpt4 key购买 nike

我想在多个线程上进行测试,所以首先我将要测试的总数平均分配给我想要的线程数(包括剩余部分)。然后我将测试分配给每个线程的数字范围。每次测试呈阳性时,计数器都会递增。我在 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# 的新手,所以我很难找到缺陷。它适用于学校,因此正确方向的提示可能比干净的答案更合适。

最佳答案

这是 C# 并行编程中的常见错误。当您通过 lambda 表达式声明匿名函数时,它们会捕获它们引用的任何变量(不是值)。在您的情况下,您的所有线程都在为 nm 计数器捕获相同的变量实例,导致它们的所有执行都看到它的最后一个值。

解决这个问题的一个简单方法是在循环范围内声明另一个变量,并将计数器复制到它。由于范围仅限于循环,因此变量不会在您的线程之间共享。

for (int nOuter = 0; nOuter < remainder; nOuter++)
{
int n = nOuter;
workers[n] = new Thread(() => CountNumbers(startvalue + n * (tasks + 1), startvalue + (n + 1) * (tasks + 1), modulus));
}
for (int mOuter = remainder; mOuter < nrthreads; mOuter++)
{
int m = mOuter;
workers[m] = new Thread(() => CountNumbers(startvalue + remainder * (tasks + 1) + (m - remainder) * tasks, startvalue + remainder * (tasks + 1) + (m - remainder + 1) * tasks, modulus));
}

编辑:如果您改用 PLINQ 或 TPL 构造,则可以简化您的代码。以下应该等同于您的整个逻辑:

Parallel.For(0, nrthreads, k =>
{
if (k < remainder)
CountNumbers(startvalue + k * (tasks + 1), startvalue + (k + 1) * (tasks + 1), modulus);
else
CountNumbers(startvalue + remainder * (tasks + 1) + (k - remainder) * tasks, startvalue + remainder * (tasks + 1) + (k - remainder + 1) * tasks, modulus);
});

关于c# - 我的多线程创建或覆盖了一个额外的/现有的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34095204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com