Différence entre le fonctionnement atomique et la sécurité des threads?

10

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?

user960567
la source
4
Les opérations atomiques aideront à garantir la sécurité des threads, mais comment pourraient-elles être la même chose ? Un «thread» n'est pas la même chose qu'une «opération».
user50849

Réponses:

11

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.

Archy
la source
Int, bool, float sont-ils sûrs ou atomiques?
user960567
1
@ user960567 - les types de données ne sont que cela: des types de données. C'est au compilateur de décider comment y accéder. Pensez à un int64 sur un processeur 8086.
mouviciel
2
En C # en particulier, avec lequel la question est étiquetée, les lectures et les écritures doivent être atomiques sur les types de données de base. Voir Ecma 334
user50849
2
Et oui, écrire 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.
Archy
4
x = 5 est atomique en c #. Mais immédiatement après cette opération, elle pourrait être écrasée. x = x + 1 est exécuté en 1. chargeant x dans le registre 2. incrémentant x dans le registre 3. stockant x dans la mémoire. Si un deuxième thread fait la même chose en même temps, les deux chargent la même valeur, l'incrémentent et la stockent, ce qui fait que x n'est incrémenté qu'une seule fois au lieu de deux. InterlockedIncrement utilise une instruction de processeur spéciale pour exécuter un incrément atomique ou assure cela en utilisant un mécanisme de verrouillage, par exemple CAS, pour s'assurer que, bien que la nouvelle valeur ne soit pas écrite, aucun autre thread ne peut lire l'ancienne valeur.
Archy
3

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).

KeithS
la source
2

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.

mouviciel
la source
Une opération en plusieurs étapes ne peut-elle pas être interrompue et être appelée encore atomique si elle est garantie de revenir en arrière?
user50849
1
Non. L'atomique doit être comprise dans sa signification étymologique: ἄτομος, atomos, indivisible.
mouviciel
Int, bool, float sont-ils sûrs ou atomiques?
user960567
Mais n'y a-t-il pas une différence entre être indivisible et paraître indivisible à un observateur ? Selon votre définition, aucune opération atomique ne peut contenir plus d'une seule étape. Je crois que le mot "apparaît" dans la définition de Wikipédia du fonctionnement atomique est important. (Je suis dans le chat si quelqu'un veut en parler) :)
user50849
Il y a une grande différence: un thread sûr peut être interrompu et il n'y a aucune garantie de temps. Ceci est essentiel dans l'informatique en temps réel. Une opération atomique (avec des verrous d'interruption si elle est à plusieurs étapes) est garantie de se terminer après un laps de temps prévisible.
mouviciel
1

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.

ADP
la source