for循环生成的工作线程列表超出for循环迭代

时间:2015-08-18 13:35:00

标签: c# multithreading for-loop

我对正确的线程相对绿色,我有这个,它是为了简单而修改但它基本上是相同的:

//Global:
N=2
bool[] mySwitches;

//In my main:

mySwitches = new bool[N];
for (int i = 0; i < N; i++)
{
    ThreadList.Add(new Thread(() => Worker(i)));
    ThreadList[i].Start();
}

//Outside of main:

Private Void Worker(int num)
{
  while(true)
  {
    if (mySwitches[num]) //error happes here because num is equal to N, how?
    {
        //do something
    }
  }
}

如上所示,工作线程以某种方式得到num = N的值,我希望它只能达到N-1。 我知道在创建Worker之后我会增加,是不是以某种方式通过引用而不是值传递?

我试图通过在while循环之前放置一个测试来修复问题,如果num = N则返回,但即使使用此规定,我也会得到相同的错误。这让我相信在线程启动后,num会以某种方式递增。

我通过在ThreadList [i] .Start()之后直接放置Sleep(20)来解决这个问题,但我真的不喜欢使用Sleep,很明显我不知道这个线程场景是如何工作的。

任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:5)

i被其引用捕获。将您的代码更改为

for (int i = 0; i < N; i++)
{
    var thInx = i;
    ThreadList.Add(new Thread(() => Worker(thInx)));
    ThreadList[thInx].Start();
}

了解更多信息:http://csharpindepth.com/articles/chapter5/closures.aspx