Tout d'abord, utilisez le mode singleton en mode conception pour éviter les initialisations multiples d'objets, provoquant une incohérence dans l'espace d'accès.
Un verrou doit être ajouté au point de comptage pour bloquer temporairement les autres comptages de threads afin de garantir l'exactitude du comptage.
Si vous souhaitez compter et sortir en temps réel, vous pouvez verrouiller le comptage et la sortie ensemble, sinon les résultats de comptage et de sortie des différents threads risquent de ne pas être traités dans l'ordre.
Un verrouillage de cette manière peut garantir un traitement séquentiel et une sortie séquentielle, mais cela entraînera une certaine perte de performances.
La position de verrouillage dans le code est très importante
Ce programme ajoutera trois opérations. La raison est que ce thread n'a pas atteint 200 fois, mais il doit y avoir un thread ajouté pour la première fois, alors faites un jugement en ajoutant.
Copiez le code comme suit :
CommonSigleton MonCompteur =CommonSigleton.Instance ;
/// <résumé>
/// Travail sur le fil
/// </summary>
public void DoSomeWork()
{
///Construire la chaîne d'affichage
résultats de chaîne = "" ;
///Créer une instance Sigleton
Système.Threading.Thread.Sleep(100);
int je = 0;
tandis que (MonCompteur.GetCounter() < 200)
{
// Assurez-vous que le décompte est cohérent avec la sortie Même si un intervalle de temps est ajouté entre le décompte et la sortie, cette zone sera verrouillée pour empêcher les autres threads de fonctionner.
verrouiller (ceci)
{
///Commence à compter
MonCompteur.Add();
Système.Threading.Thread.Sleep(100);
Fil de discussion = Thread.CurrentThread ;
résultats += "thread" ;
résultats += i++.ToString() + "――〉" + thread.Name + " " ;
results += "Compte actuel :" ;
résultats += MyCounter.GetCounter().ToString();
résultats += "/n" ;
Console.WriteLine(résultats);
// Efface la chaîne d'affichage
résultats = "" ;
}
}
}
public void StartMain()
{
Fil de discussion0 = Thread.CurrentThread ;
thread0.Name = "Thread 0" ;
Thread thread1 =nouveau Thread(nouveau ThreadStart(DoSomeWork));
thread1.Name = "Thème 1" ;
Thread thread2 =nouveau Thread(nouveau ThreadStart(DoSomeWork));
thread2.Name = "Thème 2" ;
Thread thread3 =nouveau Thread(nouveau ThreadStart(DoSomeWork));
thread3.Name = "Thème 3" ;
thread1.Start();
thread2.Start();
thread3.Start();
///Le thread 0 effectue uniquement le même travail que les autres threads
DoSomeWork();
}
}