Maison >développement back-end >C++ >Quelle est l'approche optimale pour incrémenter un compteur entier partagé sur plusieurs threads : « verrouillé », « verrouillé » ou « volatile » ?

Quelle est l'approche optimale pour incrémenter un compteur entier partagé sur plusieurs threads : « verrouillé », « verrouillé » ou « volatile » ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-27 10:51:13428parcourir

Which is the Optimal Approach for Incrementing a Shared Integer Counter Across Multiple Threads: `lock`, `Interlocked`, or `volatile`?

Fonctionnement, instruction et Interlocked Comparaison de champ lock volatile Question:

Supposons qu'une classe contient un type de champ de compteur public public, qui est accessible par plusieurs threads et n'augmente que des opérations réduites. Quelle méthode est le meilleur moyen d'augmenter ce champ, pourquoi?

int

  • lock(this.locker) this.counter ; Modifier la contre-décoration du compteur à
  • .
  • Interlocked.Increment(ref this.counter);
  • Réponse:
  • public volatile
  • Pire (pas possible):

Modifier la contre-décoration du compteur en

uniquement en utilisant Les champs ne peuvent garantir la sécurité du thread. Bien que pour s'assurer que plusieurs CPU accèdent aux mêmes données en même temps, il ne peut pas empêcher l'ingénierie des opérations de lecture et d'écriture, ce qui peut entraîner des erreurs.

    fois:
  • public volatile

volatile volatile L'instruction fournit la sécurité des threads en empêchant d'autres threads d'effectuer le code du champ de protection. Cependant, le verrou est relativement lent et peut inutile pour bloquer d'autres threads.

Meilleur:

  • lock(this.locker) this.counter ;
  • L'opération est l'atome et le thread est sûr, fournissant la méthode la plus efficace et la plus fiable pour modifier les données partagées. Ils effectuent des opérations de lecture, incrémentielles et d'écriture avec une opération à un seul temps sans verrouillage.

lock Comparaison du fonctionnement et

champ:

L'opération de l'opération effectuée dans l'exécution d'une clôture complète est utilisée pour empêcher le tri de plusieurs processeurs.

Les champs sont placés autour de la semi-forfence uniquement autour de leurs opérations, ils ne l'empêcheront pas de réduction. Par conséquent, pour la modification simultanée des données partagées, l'opération
    doit être utilisée; pour la scène où l'écrivain ne se lit jamais et le lecteur n'est jamais écrit dans la valeur atomique, le champ
  • est applicable. Interlocked.Increment(ref this.counter);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn