Primeiro, use o modo singleton no modo de design para evitar inicialização múltipla de objetos, causando inconsistência no espaço de acesso.
Um bloqueio deve ser adicionado no ponto de contagem para bloquear temporariamente outras contagens de threads para garantir a precisão da contagem.
Se você quiser contar e gerar saída em tempo real, poderá bloquear a contagem e a saída juntas. Caso contrário, os resultados da contagem e da saída de diferentes threads podem não ser processados em ordem.
O bloqueio dessa maneira pode garantir o processamento sequencial e a saída sequencial, mas isso perderá um pouco de desempenho.
A posição de bloqueio no código é muito importante
Este programa irá adicionar três operações. A razão é que este thread não atingiu 200 vezes, mas deve haver um thread adicionado pela primeira vez, então faça um julgamento na adição.
Copie o código do código da seguinte forma:
CommonSigleton MeuContador =CommonSigleton.Instance;
/// <resumo>
/// Trabalho de thread
/// </sumário>
public void DoSomeWork()
{
///Constrói string de exibição
string resultados = "";
///Cria uma instância Sigleton
System.Threading.Thread.Sleep(100);
int eu = 0;
enquanto (MyCounter.GetCounter() <200)
{
// Certifique-se de que a contagem seja consistente com a saída Mesmo se um intervalo de tempo for adicionado entre a contagem e a saída, esta área será bloqueada para evitar que outros threads operem.
bloquear (isto)
{
///Começa a contar
MeuContador.Add();
System.Threading.Thread.Sleep(100);
Thread thread = Thread.CurrentThread;
resultados += "tópico";
resultados += i++.ToString() + "――〉" + thread.Name + " ";
resultados += "Contagem atual:";
resultados += MyCounter.GetCounter().ToString();
resultados += "/n";
Console.WriteLine(resultados);
//Limpa a string de exibição
resultados = "";
}
}
}
public void StartMain()
{
Tópico thread0 = Thread.CurrentThread;
thread0.Name = "Tópico 0";
Thread thread1 =new Thread(new ThreadStart(DoSomeWork));
thread1.Name = "Tópico 1";
Thread thread2 =new Thread(new ThreadStart(DoSomeWork));
thread2.Name = "Tópico 2";
Thread thread3 =new Thread(new ThreadStart(DoSomeWork));
thread3.Name = "Tópico 3";
thread1.Iniciar();
thread2.Start();
thread3.Start();
///Thread 0 executa apenas o mesmo trabalho que outros threads
FaçaAlgumTrabalho();
}
}