J'ai utilisé la file d'attente générique dans la collection C # et tout le monde dit qu'il est préférable d'utiliser l'objet de system.collection.generic.Queue en raison de la sécurité du fil. P>
Veuillez conseiller sur la bonne décision d'utiliser l'objet de la file d'attente et comment il est en sécurité? P>
3 Réponses :
Un type de fil de protection peut être accessible en toute sécurité à partir de threads multiples sans souci de concurrence. Cela signifie généralement que le type est en lecture seule. P>
assez intéressant, Pour réfléchir à la sécurité du thread, considérez ce qui se passerait si deux threads accédaient à une file d'attente file d'attente
"Safe à fil" est un peu malheureux, car il n'a pas vraiment de définition solide. Fondamentalement, cela signifie que certaines opérations sur l'objet sont garanties de se comporter de manière judicieuse lorsque l'objet est actionné sur via plusieurs threads.
Considérez l'exemple le plus simple: un compteur. Supposons que vous ayez deux threads qui incrémentent un compteur. Si la séquence d'événements va: p>
Notez ensuite comment le compteur a «perdu» l'un des incréments. Les opérations d'incrément simples sur les comptoirs ne sont pas threadsafe; Pour les faire de la threadsafe, vous pouvez utiliser des serrures ou un interlockedincrement. P>
De même avec les files d'attente. Les files d'attente non threadsafe peuvent "perdre" enQui de la même manière que les comptoirs non threadsafe peuvent perdre des incréments. Pire, et non les files d'attente de Threadsafe peuvent même s'écraser ou produire des résultats fous si vous les utilisez dans un scénario multi-threadé incorrectement. P>
La difficulté avec "fil de fil" est que cela n'est pas clairement défini. Cela signifie-t-il simplement "ne pas crash"? Cela signifie-t-il que les résultats sensibles seront produits? Par exemple, supposons que vous ayez une collection "threadsafe". Ce code est-il correct? P>
if (!collection.IsEmpty) Console.WriteLine(collection[0]);
+1 pour le solide témoignage expert. Vous avez également raison de souligner que «le fil de fil» est un concept plutôt flou.
J'aime la réponse de toutes les questions relatives à la sécurité thread-Safety par le même mec, que je lis depuis environ 2 heures maintenant.
C'est à quoi sert l'instruction de verrouillage du matériel. Un seul noyau peut avoir la ligne de cache pendant toute la durée de l'opération RMW. Le premier noyau qui demande à la tranche de cache L3 pour la serrure est approuvé, ce qui l'entraîne d'envoyer des invalidations à d'autres cœurs, et jusqu'à ce qu'il soit déverrouillé par le noyau, d'autres noyaux ne peuvent pas offrir (je pense qu'il naisse les demandes. Mémoire vague du manuel. )
Aussi, pourquoi d'autres réponses disent une concurrence. C'est le parallélisme
Dans le traitement de multithreading, vous devez généralement traiter des problèmes de concurrence. Le terme «problèmes de concurrence» fait référence aux problèmes spécifiquement introduits par la possibilité d'entrelacer des instructions de deux contextes d'exécution différents sur une ressource partagée par les deux. Ici, en termes de sécurité du fil, les contextes d'exécution sont deux threads dans un processus; Cependant, dans des sujets connexes, ils pourraient être des processus. P>
Les mesures de sécurité du fil sont mises en place pour atteindre deux objectifs principalement. Premièrement consiste à retrouver le déterminisme en ce qui concerne ce qui se passe si le changement de contexte de threads (qui est contrôlé autrement par le système d'exploitation et donc fondamentalement non négliniste dans les programmes de niveau utilisateur), afin d'empêcher certaines tâches d'être laissées à moitié finies ou à deux contextes d'écriture à le même endroit en mémoire l'une après l'autre. La plupart des mesures utilisent simplement un peu de matériel Test-and-Set Instructions et similaires, ainsi que le niveau de logiciel Constructions de synchronisation pour forcer Tous les autres contextes d'exécution pour rester à l'écart d'un type de données, tandis qu'un autre effectue un travail qui ne doit pas être interrompu. P>
Habituellement, les objets qui sont en lecture seule sont du thread-coffre-fort. De nombreux objets qui ne sont pas en lecture seule sont en mesure d'avoir accès à des données (en lecture seule) sur plusieurs threads sans problème, si l'objet n'est pas modifié au milieu. Mais ce n'est pas la sécurité du fil. La sécurité du fil est lorsque toutes sortes de choses sont effectuées à un type de données pour éviter toute modification d'un thread de causer une corruption ou une impasse de données, même lorsqu'il s'agit de nombreuses lectures et écrivies simultanées. P>