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

Gor*_*r H 4 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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

EZI*_*EZI 5

i被其参考所捕获.将您的代码更改为

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

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

  • 我被这一次抓住了一次,但是就像你一样,我做了一份本地副本,一切都排好了.我认为这很容易让人失望 (2认同)
  • 这称为[*closure*](http://stackoverflow.com/a/271447/1997232). (2认同)