Ce n'est thread-safe signifie?
Récemment, j'ai essayé d'Accéder à une zone de texte à partir d'un thread (autre que le thread d'INTERFACE utilisateur) et une exception a été levée. Il a dit quelque chose à propos du "code qui n'est pas thread-safe" et donc j'ai fini par écrire un délégué (échantillon à partir de MSDN aidé) et de l'appeler à la place.
Mais même si je n'ai pas très bien compris pourquoi tout le code supplémentaire était nécessaire.
Mise à jour:
Vais-je courir dans des problèmes graves si je coche
Controls.CheckForIllegalCrossThread..blah =true
- par "on" je veux dire une Exception
- En règle générale, "thread-safe" signifie que quelle que soit la personne qui utilise le terme pense que cela veut dire, au moins pour cette personne. En tant que tel, il n'est pas très utile de langages de - vous besoin d'être beaucoup, beaucoup plus précis lorsque l'on parle du comportement des fils de code.
- En double?: stackoverflow.com/questions/261683/...
- Désolé j'ai essayé de chercher, mais il a abandonné...merci quand même..
- un code qui ne se pose
Race-Condition
Vous devez vous connecter pour publier un commentaire.
Eric Lippert a un joli blog post intitulé Quelle est cette chose que vous appelez un "thread-safe"? sur la définition de la sécurité des threads, comme l'a constaté de Wikipédia.
3 choses importantes extraites à partir de ces liens :
Vaut vraiment le lire!
En termes simples thread-safe signifie qu'il est sûr d'être consulté à partir de plusieurs threads. Lorsque vous utilisez plusieurs threads dans un programme, et ils sont chaque tentative d'accès à une structure commune de données ou de l'emplacement dans la mémoire de plusieurs mauvaises choses peuvent se produire. Donc, vous ajoutez un peu de code supplémentaire pour empêcher ces mauvaises choses. Par exemple, si deux personnes ont écrit le même document en même temps, la deuxième personne pour en sauver va remplacer le travail de la première personne. Pour le rendre thread-safe ensuite, vous avez à la force de la personne de 2 à attendre pour 1 personne pour compléter leur tâche avant de permettre à la personne 2 pour modifier le document.
Wikipédia a un article sur la Sécurité des Threads.
Ce définitions page (vous devez passer une annonce - désolé) le définit ainsi:
Un thread est un chemin d'exécution d'un programme. Un seul thread programme n'ont qu'un seul thread et donc ce problème ne se pose pas. Pratiquement tous les programmes graphiques ont plusieurs chemins d'exécution et, par conséquent, des filets il y a au moins deux, l'un pour le traitement de l'affichage de l'interface graphique et de remise de la saisie de l'utilisateur, et au moins un autre pour effectuer les opérations du programme.
Ceci est fait de sorte que l'INTERFACE utilisateur est toujours sensible alors que le programme de travail en transférant un long processus en cours d'exécution à tout non-INTERFACE de threads. Ces fils peuvent être créés une fois que les et n'existent que pour la durée de vie du programme, ou tout simplement obtenir créés en cas de besoin et détruits quand ils ont fini.
Que ces threads doivent souvent effectuer des actions communes - i/o disque, de la sortie des résultats sur l'écran etc. - ces parties du code devra être écrit de telle façon qu'elles peuvent être appelées à partir de plusieurs threads, souvent en même temps. Cela implique des choses comme:
Simplement , thread-safe signifie qu'une méthode ou une instance de classe peut être utilisée par plusieurs threads en même temps sans problèmes.
Envisager la méthode suivante:
Maintenant enfiler Un fil et B deux aimerais exécuter AddOne(). mais d'Une part le premier et lit la valeur de myInt (0) dans tmp. Maintenant, pour une raison quelconque, le planificateur décide de stopper Un thread et de reporter l'exécution de fil B. Thread B lit également la valeur de myInt (toujours 0) dans une variable tmp. Le fil B finitions de l'ensemble de la méthode, de sorte que dans la fin myInt = 1. Et 1 est retourné. Maintenant, c'est du Thread tourner de nouveau. Enfiler Une continue. Et ajoute 1 au tmp (tmp était de 0 pour enfiler Une). Et puis l'enregistre cette valeur dans myInt. myInt est encore 1.
Donc dans ce cas la méthode AddOne été appelé deux fois, mais parce que la méthode n'a pas été mis en œuvre dans un thread de manière sûre la valeur de myInt n'est pas 2, comme prévu, mais le 1, car le deuxième thread de lecture de la variable myInt avant le premier thread terminé la mise à jour il.
La création de thread-safe méthodes est très dur non trivial cas. Et il y a assez peu de techniques. En Java, vous pouvez marquer une méthode synchronisée, ce qui signifie qu'un seul thread peut exécuter cette méthode à un moment donné. Les autres threads attendent en ligne. Cela fait une méthode thread-safe, mais si il y a beaucoup de travail à faire dans une méthode, ce qui gaspille beaucoup d'espace. Une autre technique consiste à 'marque seulement une petite partie d'une méthode synchronized' par la création d'une serrure ou d'un sémaphore, et le verrouillage de cette petite partie (appelée section critique). Il y a même des méthodes qui sont mises en œuvre sous le lock-moins thread-safe, ce qui signifie qu'ils sont construits de telle manière que plusieurs threads peuvent course à travers eux, en même temps, sans jamais l'origine des problèmes, cela peut être le cas lorsqu'une méthode est exécutée uniquement un atomique appel. Atomique appels sont des appels qui ne peut pas être interrompu et ne peut être fait que par un seul thread à la fois.
Un module est thread-safe, si elle garantit de pouvoir conserver ses invariants dans le visage de multi-thread et agrément d'utilisation.
Ici, un module peut être une structure de données, de classe, d'objet, de méthode, de procédure ou de fonction. Fondamentalement, l'étendue morceau de code et de données connexes.
La garantie peut éventuellement être limitée à certains environnements spécifiques de l'architecture du PROCESSEUR, mais il doit détenir pour les environnements. Si il n'est pas explicite à la délimitation des milieux, alors qu'il est généralement pris à penser qu'il vaut pour tous les environnements que le code peut être compilé et exécuté.
Thread-dangereux modules peut fonctionner correctement sous multi-thread et l'utilisation simultanée, mais c'est souvent plus bas à la chance et le hasard, qu'une conception soignée. Même si certains module n'a pas de pause pour vous, il peut se briser lors d'un déplacement à d'autres environnements.
Multi-threading, des bugs sont souvent difficiles à déboguer. Certaines d'entre elles ne produisent de temps en temps, tandis que d'autres manifestent de façon agressive - ce trop, peut-être spécifiques à un environnement. Ils peuvent se manifester comme subtilement de mauvais résultats, ou de blocages. Ils peuvent gâcher des données-structures de manière imprévisible, et causer d'autres apparemment impossible de bugs apparaissent dans d'autres régions éloignées du code. Il peut être très spécifiques à l'application, de sorte qu'il est difficile de donner une description générale.
Vous pouvez obtenir plus d'explications dans le livre "Java Simultanéité dans la Pratique":
Dans l'exemple du monde réel pour le profane est
Supposons que vous avez un compte en banque avec l'internet et le mobile banking et votre compte seulement 10$.
Vous avez effectué le transfert de l'équilibre à un autre compte à l'aide de services bancaires mobiles, et en attendant, vous avez fait du shopping en ligne en utilisant le même compte en banque.
Si ce compte en banque n'est pas thread-safe, la banque vous permet d'effectuer les deux opérations en même temps et ensuite, la banque fait faillite.
Thread-safe signifie que l'état d'un objet ne change pas si simultanément plusieurs threads tentent d'accéder à l'objet.
La sécurité des threads: Un thread programme de sécurité protège les données de la mémoire erreurs de cohérence. Dans un environnement hautement programme multi-threadé, un thread-safe programme ne cause pas d'effets secondaires avec de multiples opérations de lecture/écriture à partir de plusieurs threads sur les mêmes objets. Différents threads peuvent partager et de modifier les données de l'objet sans erreurs de cohérence.
Vous pouvez atteindre la sécurité des threads en utilisant la pointe de la simultanéité de l'API. Cette documentation page fournit de bonnes constructions de programmation pour parvenir à la sécurité des threads.
Verrouiller des Objets de soutien de verrouillage des idiomes que de simplifier de nombreuses applications simultanées.
Exécuteurs définir une API de haut niveau pour le lancement et la gestion des threads. Exécuteur implémentations fournies par java.util.simultanées fournir pool de threads de gestion adapté pour les applications à grande échelle.
les Collections Simultanées le rendre plus facile à gérer de grands ensembles de données, et peut réduire considérablement la nécessité pour la synchronisation.
Atomique Variables caractéristiques de réduire la synchronisation et de l'aider à éviter la consistance de la mémoire des erreurs.
ThreadLocalRandom (dans le JDK 7) fournit efficace de génération de nombres pseudo-aléatoires à partir de plusieurs threads.
Reportez-vous à java.util.simultanées et java.util.de façon concomitante.atomique aussi les paquets pour les autres constructions de programmation.
Vous êtes clairement dans un WinForms de l'environnement. WinForms contrôles de l'exposition l'affinité de thread, ce qui signifie que le thread dans lequel ils sont créés est le seul fil qui peut être utilisé pour accéder et mettre à jour. C'est pourquoi vous trouverez des exemples sur MSDN et d'ailleurs de démontrer comment marshall à l'appel en arrière sur le thread principal.
Normal WinForms pratique est d'avoir un seul thread qui est dédié à tous de votre INTERFACE de travail.
Je trouve le concept de http://en.wikipedia.org/wiki/Reentrancy_%28computing%29 à ce que j'ai l'habitude de penser comme dangereux threading qui est quand une méthode et s'appuie sur un effet secondaire comme une variable globale.
Par exemple, j'ai vu du code qui a formaté des nombres à virgule flottante chaîne, si deux de ces actions sont exécutées dans différents threads de la valeur globale de decimalSeparator peuvent être modifiées de façon permanente à '.'
Pour comprendre la sécurité des threads, lire ci-dessous les sections: