我对正确的线程相对绿色,我有这个,它是为了简单而修改但它基本上是相同的:
//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,很明显我不知道这个线程场景是如何工作的。
任何人都可以对此有所了解吗?
答案 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