线程参数被更改
当启动多个线程时,我正在解析的id
参数有时是错误的。 这是我的创业公司:
for (int i = 0; i WorkerThread(i)); thread.Start(); _threads.Add(thread); }
我的线程function:
private void WorkerThread(int id) { Console.WriteLine("[{0}] Thread started {1}", DateTime.Now.ToLongTimeString(), id); }
此代码的输出是:
[19:10:54] Thread start 3 [19:10:54] Thread start 9 [19:10:54] Thread start 4 [19:10:54] Thread start 12 [19:10:54] Thread start 11 [19:10:54] Thread start 3 [19:10:54] Thread start 12 [19:10:54] Thread start 6 [19:10:54] Thread start 9 [19:10:54] Thread start 6 [19:10:54] Thread start 13 [19:10:54] Thread start 2 [19:10:54] Thread start 15 [19:10:54] Thread start 9 [19:10:54] Thread start 15
在我看来,这个代码应该创建每个具有唯一id
而不是重复的线程,如上所示。
编译器信息:
平台目标:x64
目标框架:.NET Framework 4.5
你应该小心在启动线程后意外修改像i
这样的捕获变量,因为i
是共享的 。 i
变量指的是整个循环生命周期中的相同内存位置。 解决方案是使用这样的临时变量 :
for (int i = 0; i < _threadCount; i++) { var i1 = i; Thread thread = new Thread(() => WorkerThread(i1)); thread.Start(); _threads.Add(thread); }
阅读更多关于闭包的信息: 闭塞 之美( Jon Skeet )和Lambda表达式以及( Joseph Albahari )的变量。
问题是i
变量通过循环的生命周期引用相同的内存位置。 因此,每个线程都会调用一个变量,该变量的值可能会在运行时发生变化。 解决方案是使用临时变量int temp = i
。 正如@ S.Akbari所说。