J'ai plusieurs threads qui doivent tous écrire dans le même dictionnaire. J'ai un verrou sur un objet que je maintiens afin de m'assurer qu'un seul thread met à jour le dictionnaire à la fois. Ma question est la suivante. Si un thread tente de mettre à jour le dictionnaire alors qu'un autre a un verrou, le thread sait-il simplement attendre? Est-ce que ça va juste échouer? Si les threads attendent juste, je peux éviter que trop d'entre eux n'attendent, est-il possible de dire qu'un maximum de cinq têtes peuvent faire la queue, le reste continue?Verrouillage et multi-thread dans dotNet
Répondre
Si un thread maintient un verrou et qu'un second thread essaie d'acquérir le même verrou, le second thread attendra.
Les threads n'écrivent-ils ou avez-vous également des opérations de lecture? Si c'est le cas, vous devriez probablement utiliser ReaderWriterLockSlim
(à moins que vous ne le fassiez déjà). Cela vous permettra de lire plusieurs threads en parallèle, sauf si un thread est en train de se mettre à jour, auquel cas il peut avoir un accès exclusif à la ressource.
L'instruction lock (obj) empêche tout autre thread d'accéder à la ressource partagée tant que ce thread n'est pas terminé.
Les serrures ne protègent pas les objets en soi. Les verrous protègent les autres threads contre l'acquisition du même verrou. Donc, si un verrou est conçu pour protéger une ressource (comme un dictionnaire), les autres threads doivent coopérer et acquérir le même verrou avant d'accéder à la ressource (le dictionnaire). Si un thread ignore cela et accède à la ressource non moins, alors il peut rencontrer un état invalide, transitoire, dans le dictionnaire et, par conséquent, rencontrer toutes sortes d'erreurs. Cela s'applique aux opérations de lecture et d'écriture. Les classes de collection dans .Net sont fournies avec une propriété nommée SyncRoot qui est généralement l'objet recommandé pour tous les threads à utiliser si plusieurs accès au thread sont refusés. Aussi comme Fredrik l'a déjà souligné, il existe des types spécialisés ReaderWriter qui permettent des lectures multiples, partagées, et une écriture unique et exclusive. Des schémas plus complexes comme celui que vous citez (éviter une opération si trop de threads attendent la ressource) sont assez difficiles à coder de manière complètement sûre et correcte, il vaut donc mieux éviter de telles complications et s'en tenir aux primitives de base.
- 1. Verrouillage et synchronisation dans DJango
- 2. nHibernate session et multithread
- 3. SQL dans dotNET
- 4. Filestream, verrouillage et serlialization
- 5. dotnet fuscator
- 6. requiredfieldvalidater sur updatepan dans dotnet
- 7. comment intégrer dotnet dans embarqué?
- 8. Java EE concurrence et verrouillage
- 9. Verrouillage dans SQL Server
- 10. DotNet Oracle ORM
- 11. dotnet: ListChangedType.ItemDeleted est inutile?
- 12. Faciliter le verrouillage dans les MTA
- 13. SetCurrentDirectory dans une application multithread
- 14. Les pools multithread et autorelease fonctionnent-ils ensemble dans Cocoa?
- 15. JDBC multithread
- 16. Filetage: verrouillage sur dictionnaire générique
- 17. Différence entre verrou (verrou) et verrouillage (variable_qui_utilise_I_am_using)
- 18. Débogueur multithread
- 19. Verrouillage de la chaîne via le verrouillage
- 20. Enregistrer le verrouillage dans vba
- 21. Generics et de verrouillage sur les collections
- 22. Verrouillage réentrant
- 23. CSharp/DotNet: Sérialisation, Génériques et classes de base
- 24. Contrôle RichTextBox dans une application multithread
- 25. Application multithread dans un processeur multicœur
- 26. Gestionnaire d'événements dans Qt avec multithread
- 27. Condition Monitor.Wait/Pulse dans un serveur multithread
- 28. Opération de recherche multithread
- 29. Copies profondes multithread
- 30. Winforms scénario multithread question