开发者

array of threads c#

开发者 https://www.devze.com 2023-01-07 19:09 出处:网络
i have this code: Thread[] threadsArray = new Thread[4]; for (int i = 0; i < 4; i++) { threadsArray[i] = new Thread(() => 开发者_StackOverflowc1.k(i));

i have this code:

    Thread[] threadsArray = new Thread[4];
        for (int i = 0; i < 4; i++)
        {
            threadsArray[i] = new Thread(() => 开发者_StackOverflowc1.k(i));
        }
        for (int i = 0; i < 4; i++)
        {
            threadsArray[i].Start();
        }
        for (int i = 0; i < 4; i++)
        {
            threadsArray[i].Join();
        }

the function k is this:

void k(int i)
{
    while(true)
      Console.WriteLine(i);
}

for some reason just the last thread is running and printing 4444444.... why aren't all the threads running?


All of the threads are printing the same variable.

Your lambda expression (() => c1.k(i)) captures the i variable by reference.
Therefore, when the lambda expression runs after i++, it picks up the new value of i.

To fix this, you need to declare a separate variable inside the loop so that each lambda gets its own variable, like this:

    for (int i = 0; i < 4; i++)
    {
        int localNum = i;
        threadsArray[i] = new Thread(() => c1.k(localNum));
    }


You are closing over the i variable.

Try this instead

for (int i = 0; i < 4; i++)
{
    int x = i;
    threadsArray[i] = new Thread(() => c1.k(x));
}


Thread[] threadsArray = new Thread[4];
for (int i = 0; i < 4; i++)
{
    //better use ParameterizedThreadStart Delegate
    threadsArray[i] = new Thread(k);
}
for (int i = 0; i < 4; i++)
{
    //passing the value to the function
    threadsArray[i].Start(i);
}
for (int i = 0; i < 4; i++)
{
    threadsArray[i].Join();
}

//changing the input data type
void k(object i)
{
    while (true)
        Console.WriteLine((int)i);
}
0

精彩评论

暂无评论...
验证码 换一张
取 消