|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre Expert
![]() Arnaud Développeur .NET Inscription : avril 2006 Messages : 1 386 ![]() |
Hello,
je rencontre un souci avec le ReaderWriterLockSlim. Je l'utilise dans une classe qui a pour charge de gérer des accès à des IO (ports séries et tcp) en fonction de liste d'attente. Application en cours d'exécution, je vois mes threads monter, je fais pause, j'affiche la liste des threads, et j'en repère un qui est dans le write, appel à ExitWriteLock en cours, les autres threads étant sur un TryEnterWriteLock dans une autre fonction. Je fais un resume du programme, pause quelques secondes plus tard, le thread est toujours en cours d'attente de la fin du ExitWriteLock, et mes autres threads s'accumulent à la porte d'entrée. Pour ExitWriteLock ne rend pas la main dans ce cas de figure ? Merci pour votre aide ! |
|
|
00
|
|
|
#2 | ||
|
Membre éprouvé
![]() Ingénieur développement logiciels Inscription : mars 2011 Messages : 258 ![]() |
Bonjour,
Ton cas est un peu bizarre, ceci n'est pas censé arrivé. Et tu sur de bien avoir acquis le verrou, avant de vouloir le relâcher, en vérifiant bien le retour de TryEnterWriteLock comme ceci Code :
As tu autorisé le verrouillage récursif? |
||
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Arnaud Développeur .NET Inscription : avril 2006 Messages : 1 386 ![]() |
Hello.
pas de récursion. je try/finally pour quitter le lock (après un TryEnter et test du booléen en entrée/sortie). Mais j'ai trouvé un élément qui explique ce fait, readWriteLockSlim n'est pas safe sur un Thread.abort contrairement à Monitor.Enter. Actuelleemnt j'ai revu mon code pour exclure les ReadWriteLockSlim et utiliser les ConcurrencyDictionnary Edit : les Liens http://stackoverflow.com/questions/1...any-properties http://www.bluebytesoftware.com/blog...c-7847d98f1641 http://www.bluebytesoftware.com/blog...b90a7d11a.aspx |
|
|
00
|
|
|
#4 | ||
|
Membre éprouvé
![]() Ingénieur développement logiciels Inscription : mars 2011 Messages : 258 ![]() |
C'est vrai que Thread.Abort c'est assez brutal.
Mais dans le cas présent j'ai raté un truc. La façon dont le "TryEnter" est écrit n'est pas du tous tolérante au exception Code :
Ce problème peut facilement être contournable, en n'utilisant pas Abort, mais une condition d’arrêt sur le thread. |
||
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Arnaud Développeur .NET Inscription : avril 2006 Messages : 1 386 ![]() |
je l'avais écrit comme cela, mais l'idée y est :
Code :
|
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com