2009-06-29 6 views
0

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

1

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.

0

L'instruction lock (obj) empêche tout autre thread d'accéder à la ressource partagée tant que ce thread n'est pas terminé.

0

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.