gpt4 book ai didi

C# 线程...不理解为什么我的循环是 5;

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

class Thread1_8
{
static int shared_total;
static int thread_count;
static readonly object locker = new object();

static void Main()
{
int[,] arr = new int[5, 5] { { 1,2,3,4,5}, {5,6,7,8,9}, {9,10,11,12,13}, {13,14,15,16,17}, { 17,18,19,20,21} };

for(int i = 0; i < 5; i++)
{
new Thread(() => CalcArray(i, arr)).Start();
}


while(thread_count < 5)
{

}
Console.WriteLine(shared_total);
}

static void CalcArray(int row, int[,] arr)
{

int length = arr.GetLength(0);
int total = 0;
for(int j = 0; j < length; j++)
{
total += arr[row,j];
}

lock (locker)
{
shared_total += total;
thread_count++;
}
}
}

我不断收到 System.IndexOutOfRangeException。

原因是因为出于某种原因我在初始 for 循环中的“i”被设置为 5 并且由于某种原因仍然进入循环。我不明白为什么。起初我认为这可能是因为我创建的每个线程都在递增数组但它不应该因为线程有一个完整的独立执行路径,它应该直接跳转到 CalcArray 方法。

最佳答案

发生这种情况的原因很微妙:当你这样做的时候

for(int i = 0; i < 5; i++) {
new Thread(() => CalcArray(i, arr)).Start();
}

变量 i从值 0 一直到 5,循环在此时停止,因为 5 < 5评估为 false .

线程在循环结束后开始,所以row的值它看到的是 5 , 而不是 0 到 4。

这可以通过创建一个局部变量来解决 row在循环内。

代码中的另一个问题是检查 thread_count里面Main没有锁定,处于繁忙的循环中。这不是与线程同步的最佳过程。考虑使用 ManualResetEventSlim相反。

关于C# 线程...不理解为什么我的循环是 5;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34802244/

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