D'après la discussion que j'ai vue, il semble que le fonctionnement atomique et la sécurité des threads sont la même chose, mais beaucoup de gens disent qu'ils sont différents. Quelqu'un peut-il me dire la différence s'il y en a un?
D'après la discussion que j'ai vue, il semble que le fonctionnement atomique et la sécurité des threads sont la même chose, mais beaucoup de gens disent qu'ils sont différents. Quelqu'un peut-il me dire la différence s'il y en a un?
Réponses:
Les opérations atomiques sont un moyen d'assurer la sécurité des threads soit en utilisant une sorte de verrous comme Mutexes ou Semaphores qui utilisent des opérations atomiques en interne ou en implémentant une synchronisation sans verrouillage en utilisant des barrières atomiques et mémoire.
Les opérations atomiques sur les types de données primitifs sont donc un outil pour assurer la sécurité des threads mais ne garantissent pas automatiquement la sécurité des threads car vous avez normalement plusieurs opérations qui dépendent les unes des autres. Vous devez vous assurer que ces opérations sont effectuées sans interruption, par exemple en utilisant Mutexes.
Oui, l'écriture d'un de ces types de données atomiques en c # est thread-safe, mais cela ne rend pas la fonction que vous les utilisez dans thread-safe. Il garantit uniquement que l'écriture unique est correctement exécutée même si un deuxième thread y accède "en même temps". Néanmoins, la prochaine lecture à partir du thread actuel n'est pas assurée pour obtenir la valeur précédemment écrite car un thread différent pourrait y avoir écrit, seulement que la valeur lue est valide.
L'atomicité et la sécurité des threads sont deux choses différentes. L'atomicité se réfère à la qualité «tout ou rien» d'une opération; si une opération ne peut pas être exécutée à 100% avec succès, le système doit rester dans l'état dans lequel il se trouvait avant le début de toute partie de l'opération. L'exemple classique est une transaction de base de données; Lorsque vous enregistrez une facture, y compris son en-tête et plusieurs éléments de ligne, chaque partie de chaque ligne de base de données doit être mise en place avec succès; sinon, les données sont perdues ou corrompues. Si un élément de campagne ne peut pas être inséré, non seulement aucune autre ligne ne doit être insérée, mais aucune des lignes déjà traitées ne doit rester.
La sécurité des threads fait référence à une combinaison de choses, y compris l'atomicité, qui permet à une opération d'être "réentrante"; plusieurs travailleurs peuvent effectuer la même opération, en commençant au même moment ou à des moments différents, sans effet sur aucun autre. Il existe de nombreux modèles pour un fonctionnement sans fil; la plupart d'entre eux se résument conceptuellement à exécuter plusieurs tâches parallèles de manière totalement isolée (deux travailleurs peuvent effectuer la même tâche sur deux objets ou collections d'objets différents sans jamais savoir que l'autre travailleur existe même), ou à mettre en place un "pipeline" dans lequel plusieurs travailleurs effectuent chacun une tâche sur une opération entière (soit chaque travailleur progresse de la première tâche à la suivante et ainsi de suite, soit se concentre sur une tâche et transfère son "produit de travail" intermédiaire au travailleur suivant).
Une opération atomique est une opération qui ne peut pas être interrompue.
Un thread sûr est un thread qui peut être interrompu en toute sécurité.
La sécurité des threads est obtenue avec les opérations atomiques, en particulier dans la logique qui empêche les ressources critiques d'être accédées plusieurs fois.
L'opération atomique de base est Test-and-set , qui est utilisé pour implémenter des sémaphores, qui à leur tour sont utilisés pour implémenter la sécurité des threads.
La sécurité des threads est plus un cadre ou un «concept», le fonctionnement atomique est un sous-ensemble, un moyen (parmi d'autres) d'atteindre le statut de «thread-safe».
La sécurité des threads fait référence à un processus auquel on peut accéder par des threads séparés, où l'accès de l'un (et la manipulation des données), ne corrompra pas l'intégrité du fonctionnement de l'autre.
Une grande partie de l'habileté du programmeur est de savoir comment y parvenir, selon la situation et l'objectif clé, vous devrez peut-être implémenter, par exemple: verrous, sémaphores, verrous, objets atomiques, règles de synchronisation, etc.