Primero, utilice el modo singleton en el modo de diseño para evitar la inicialización múltiple de objetos, lo que provocará inconsistencia en el espacio de acceso.
Se debe agregar un candado en el punto de conteo para bloquear temporalmente el conteo de otros hilos para garantizar la precisión del conteo.
Si desea contar y generar en tiempo real, puede bloquear el conteo y la salida juntos. De lo contrario, es posible que los resultados del conteo y la salida de diferentes subprocesos no se procesen en orden.
Bloquear de esta manera puede garantizar el procesamiento secuencial y la salida secuencial, pero esto perderá algo de rendimiento.
La posición de bloqueo en el código es muy importante.
Este programa agregará tres operaciones. La razón es que este hilo no ha llegado a 200 veces, pero debe agregarse un hilo por primera vez, así que haga un juicio adicional.
Copie el código de código de la siguiente manera:
CommonSigleton MiContador =CommonSigleton.Instancia;
/// <resumen>
/// Trabajo de hilo
/// </summary>
vacío público DoSomeWork()
{
/// Construir cadena de visualización
resultados de cadena = "";
///Crear una instancia de Sigleton
Sistema.Threading.Thread.Sleep(100);
int yo = 0;
mientras (MiContador.GetCounter() < 200)
{
// Asegúrese de que el recuento sea coherente con la salida. Incluso si se agrega un intervalo de tiempo entre el recuento y la salida, esta área se bloqueará para evitar que funcionen otros subprocesos.
bloquear (esto)
{
///Comenzar a contar
MiContador.Add();
Sistema.Threading.Thread.Sleep(100);
Hilo hilo = Thread.CurrentThread;
resultados += "hilo";
resultados += i++.ToString() + "――〉" + hilo.Nombre + " ";
resultados += "Recuento actual:";
resultados += MyCounter.GetCounter().ToString();
resultados += "/n";
Console.WriteLine(resultados);
// Borrar la cadena de visualización
resultados = "";
}
}
}
inicio público vacío principal ()
{
Hilo hilo0 = Thread.CurrentThread;
thread0.Name = "Subproceso 0";
Hilo hilo1 = nuevo hilo (nuevo ThreadStart (DoSomeWork));
thread1.Name = "Subproceso 1";
Hilo hilo2 = nuevo hilo (nuevo ThreadStart (DoSomeWork));
thread2.Name = "Subproceso 2";
Hilo hilo3 = nuevo hilo (nuevo ThreadStart (DoSomeWork));
thread3.Name = "Subproceso 3";
hilo1.Inicio();
hilo2.Inicio();
hilo3.Inicio();
/// El subproceso 0 solo realiza el mismo trabajo que otros subprocesos
HacerAlgoTrabajo();
}
}