Signifie-t-il que deux threads ne peuvent pas changer les sous-tendent simultanément des données? ou signifie-t-il que le code de la composante sera exécutée avec des résultats imprévisibles lorsque plusieurs threads sont en cours d'exécution?
Réponses
Trop de publicités?de wikipedia :
Fil de sécurité est un ordinateur de programmation de concept applicable dans le cadre de programmes multi-thread. Un morceau de code est thread-safe s'il fonctionne correctement lors de l'exécution simultanée par plusieurs threads. En particulier, elle doit répondre à la nécessité pour plusieurs threads d'accéder aux mêmes données partagées, et la nécessité du partage des morceau de données accessibles par un seul thread à la fois.
...
Il ya quelques façons de parvenir à la sécurité des threads:
Re-entrancy
L'écriture de code de telle manière qu'il peut être exécuté en partie par une tâche, rentré par une autre tâche, et a repris à partir de la tâche d'origine. Cela nécessite l'enregistrement des informations d'état dans les variables locales à chaque tâche, généralement sur sa pile, au lieu d'en statique ou des variables globales.
Exclusion mutuelle
L'accès aux données partagées est sérialisée en utilisant des mécanismes qui assurent un seul thread lit ou écrit des données partagées à tout moment. Un grand soin est nécessaire si un morceau de code d'accès à une multitude de partagé des morceaux de donnée-des problèmes d'inclure des conditions de course, les blocages, livelocks, la famine, et divers autres maux énumérés dans de nombreux systèmes d'exploitation les manuels scolaires.
Fil de stockage local
Les Variables sont localisés de façon que chaque thread possède sa propre copie privée. Ces variables conservent leurs valeurs à travers le sous-programme et le code frontières, et sont thread-safe, depuis qu'elles sont locales à chaque thread, même si le code qui accède peut-être réentrant.
Les opérations atomiques
Données partagées sont accessibles par le biais d'opérations atomiques qui ne peut être interrompu par d'autres threads. Cela requiert généralement l'utilisation de spécial instructions en langage machine, qui peut être disponible dans une bibliothèque d'exécution. Puisque les opérations sont atomiques, les données partagées sont toujours maintenus dans un état valide, peu importe ce que les autres threads d'accès. Les opérations atomiques forment la base de beaucoup de fil mécanismes de verrouillage.
lire la suite :
http://en.wikipedia.org/wiki/Thread_safety
en allemand : http://de.wikipedia.org/wiki/Threadsicherheit
en français : http://fr.wikipedia.org/wiki/Threadsafe (très court)
Un plus instructif question est ce que fait le code pas thread-safe - et la réponse est qu'il y a quatre conditions qui doivent être remplies... Imaginez le code suivant (et il est lavable à la langue de traduction)
totalRequests = totalRequests + 1
MOV EAX, [totalRequests] // load memory for tot Requests into register
INC EAX // update register
MOV [totalRequests], EAX // store updated value back to memory
- La première condition est qu'il y a des emplacements de mémoire qui sont accessibles à partir de plusieurs threads. Généralement, ces emplacements sont global/variables statiques ou de segment de mémoire accessible à partir d'global/variables statiques. Chaque thread obtient son propre cadre de pile pour la fonction/méthode de portée des variables locales, de sorte que ces local de la fonction/méthode des variables, otoh, que, (qui sont sur la pile) sont accessibles uniquement à partir de l'un thread qui possède la pile.
- La deuxième condition est qu'il y a une propriété (souvent appelé un invariant), qui est associée à ces emplacements de mémoire qui doit être vrai, ou valide, pour que le programme fonctionne correctement. Dans l'exemple ci-dessus, la propriété est que "totalRequests doit représenter avec précision le nombre total de fois qu'un thread a exécuté une partie de l'incrément de déclaration". En général, la propriété doit être vrai (dans ce cas, totalRequests doit tenir un décompte précis) avant une mise à jour pour la mise à jour correcte.
- La troisième condition est que l'invariant de la propriété ne tient PAS pendant une certaine partie de la mise à jour réelle. (Il est transitoirement invalide ou false pendant une certaine partie de la transformation). Dans ce cas particulier, à partir du moment totalRequests est transportée jusqu'au moment où il est stocké, totalRequests ne pas satisfaire l'invariant.
- La quatrième et dernière condition qui doit se produire pour une course à arriver (et pour le code donc PAS "thread-safe") c'est qu'un autre thread doit être en mesure d'accéder à la mémoire partagée , tandis que l'invariant est rompu, provoquant ainsi l'incohérence ou d'un comportement incorrect.
J'aime la définition de Brian Goetz Java de la Simultanéité dans la Pratique de son exhaustivité
"Une classe est thread-safe s'il se comporte correctement lors de l'accès à partir de plusieurs threads, indépendamment de la planification ou de l'entrelacement de l'exécution de ces threads par l'environnement d'exécution, et l'absence de synchronisation supplémentaires ou d'autres de la coordination de la partie du code appelant."