正在更改的线程参数
Thread parameters being changed
启动多线程时,我正在解析的id
参数有时是错误的。这是我的启动:
for (int i = 0; i < _threadCount; i++)
{
Thread thread = new Thread(() => WorkerThread(i));
thread.Start();
_threads.Add(thread);
}
还有我的线程函数:
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
是 shared。 i
变量在整个循环的生命周期中引用相同的内存位置。 解决方案 是使用 临时变量,如下所示:
for (int i = 0; i < _threadCount; i++)
{
var i1 = i;
Thread thread = new Thread(() => WorkerThread(i1));
thread.Start();
_threads.Add(thread);
}
在此处阅读有关 闭包 的更多信息:The Beauty of Closures from (Jon Skeet) and Lambda expressions and captured variables from (Joseph Albahari).
问题是 i
变量在循环的整个生命周期中引用相同的内存位置。因此,每个线程调用一个变量,该变量的值可能会发生变化,因为它是运行。解决方案是使用一个临时变量 int temp = i
。正如所说。
启动多线程时,我正在解析的id
参数有时是错误的。这是我的启动:
for (int i = 0; i < _threadCount; i++)
{
Thread thread = new Thread(() => WorkerThread(i));
thread.Start();
_threads.Add(thread);
}
还有我的线程函数:
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
是 shared。 i
变量在整个循环的生命周期中引用相同的内存位置。 解决方案 是使用 临时变量,如下所示:
for (int i = 0; i < _threadCount; i++)
{
var i1 = i;
Thread thread = new Thread(() => WorkerThread(i1));
thread.Start();
_threads.Add(thread);
}
在此处阅读有关 闭包 的更多信息:The Beauty of Closures from (Jon Skeet) and Lambda expressions and captured variables from (Joseph Albahari).
问题是 i
变量在循环的整个生命周期中引用相同的内存位置。因此,每个线程调用一个变量,该变量的值可能会发生变化,因为它是运行。解决方案是使用一个临时变量 int temp = i
。正如