c# - pasar - Se modificaron los parámetros del hilo
parameterizedthreadstart (2)
Debe tener cuidado al modificar accidentalmente variables capturadas como
i
después de iniciar el hilo, porque el
i
se
comparte
.
La variable
i
refiere a la misma ubicación de memoria durante toda la vida útil del bucle.
La
solución
es usar una
variable temporal
como esta:
for (int i = 0; i < _threadCount; i++)
{
var i1 = i;
Thread thread = new Thread(() => WorkerThread(i1));
thread.Start();
_threads.Add(thread);
}
Lea más sobre Closures aquí: La belleza de los Closures de ( Jon Skeet ) y las expresiones Lambda y las variables capturadas de ( Joseph Albahari ).
Al iniciar varios subprocesos, el parámetro
id
que estoy analizando a veces es incorrecto.
Aquí está mi inicio:
for (int i = 0; i < _threadCount; i++)
{
Thread thread = new Thread(() => WorkerThread(i));
thread.Start();
_threads.Add(thread);
}
Y mi función de hilo:
private void WorkerThread(int id)
{
Console.WriteLine("[{0}] Thread started {1}", DateTime.Now.ToLongTimeString(), id);
}
La salida de este código es:
[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
En mi opinión, este código debería crear cada hilo con una
id
única en lugar de duplicados como se ve arriba.
Información del compilador:
Objetivo de plataforma: x64
Marco de destino: .NET Framework 4.5
El problema es que la variable
i
refiere a la misma ubicación de memoria durante la vida útil del bucle.
Por lo tanto, cada subproceso invoca una variable cuyo valor puede cambiar a medida que se ejecuta.
La solución es usar una variable temporal
int temp = i
.
como dijo
@Salah Akbari
.