Dans des circonstances normales, tant que la programmation multithread est impliquée, la complexité du programme augmentera considérablement, les performances diminueront considérablement, et la probabilité de bugs augmentera considérablement.
La programmation multithread est destinée à exécuter un programme en parallèle afin d’améliorer les capacités de traitement des données, mais dans la plupart des cas, elle implique une concurrence pour des ressources partagées, il doit donc être verrouillé lors de la modification d’objets ressource. Cependant, il existe de nombreuses façons d’implémenter les verrous, alors examinons la mise en œuvre et les performances de plusieurs types de verrous en C#.
Plusieurs façons d’utiliser les serrures
1. Verrou atomique
Atteindre la concurrence « sans serrure » via l’opération atomique Interlocked. ComparerÉchange.
L’explication officielle est de fournir des opérations atomiques pour des variables partagées par plusieurs threads. Espace de noms : System.Threading
2. Zone critique
La sérialisation de plusieurs threads pour accéder à des ressources publiques ou à un morceau de code est rapide et adaptée pour contrôler l’accès aux données. La syntaxe de verrou en C# est un sucre syntaxique pour la zone critique (Moniteur).
3. Fonctionnement atomique
Les opérations atomiques, qui sont un cas particulier, sont intrinsèquement sûres pour les threads, il n’y a donc pas besoin de les verrouiller.
Interprété officiellement comme l’incrémentation de la valeur d’une variable donnée sous forme d’opération atomique et le stockage du résultat. Espace de noms : System.Threading
4. Verrou de lecture et d’écriture
Les verrous lecture-écriture permettent de lire des ressources lorsque d’autres programmes écrivent, donc si la ressource permet des lectures inappropriées, c’est plus approprié.
L’explication officielle indique un état verrouillé utilisé pour gérer l’accès aux ressources, permettant des lectures multithread ou un accès exclusif en écriture. L’espace de noms est System.Threading
5. Sémaphore
Des sémaphores, conçus pour contrôler un nombre limité de ressources utilisateur.
L’explication officielle limite le nombre de threads pouvant accéder à une ressource ou à un pool de ressources en même temps. L’espace de noms est System.Threading
6. Événements
Utilisé pour notifier le fil de discussion que certains événements se sont produits, lançant ainsi le début d’une tâche successeure.
L’explication officielle indique que les événements de synchronisation de thread se réinitialisent automatiquement lorsqu’un signal est reçu après la libération d’un thread. De tels types ne peuvent pas être hérités.
7. Exclusion mutuelle
Il existe une classe Mutex en C#, juste sous l’espace de noms System.Threading, Mutex est en réalité un mutex, qui peut non seulement gérer la concurrence entre plusieurs threads, mais aussi gérer la concurrence entre processus.
Code de test de performance
Exécutez le code
Résultats des tests de performance
Note : Les données ci-dessus ne résultent que des performances matérielles de l’environnement de test actuel, et ne peuvent être comparées qu’entre elles.
1) Dans divers tests, c’est clairement le plus rapide à ne pas bloquer, donc essayez d’éviter la concurrence des ressources qui mène à un blocage de fonctionnement.
2) Interlocked.CompareExchange montre constamment de meilleures performances en multithreading, se classant deuxième.
3) La troisième serrure, la zone critique, montre aussi de bonnes performances, donc merci de réfuter les autres qui disent que la performance de la serrure est faible.
4) La quatrième place est l’opération à variable atomique (atomique), mais actuellement, elle ne supporte que l’auto-augmentation et la soustraction des variables, et l’applicabilité n’est pas forte.
5) Les performances du cinquième verrou lecture/écriture (ReaderWriterLockSlim) sont également correctes, et il ne supporte rien de la lecture, et la praticité reste relativement bonne.
6) Les sémaphores, événements et mutex restants ont les pires performances, bien sûr, ils ont leur propre champ d’application, mais ils ne sont pas efficaces pour gérer la concurrence des ressources.
Adresse du lien original :La connexion hyperlientérée est visible.
|