OVH Cloud OVH Cloud

un instance de class ou l'on accède chacun son tour (mutex inside)

13 réponses
Avatar
Yannick S.
bonjour,

j'ai une instance(myToto) de class Toto avec les méthodes tata() et tutu().

plusieurs threads accèdes à myToto. J'aimerai que un seul thread à la fois
puisse accéder à cette instance de class. J'ai une solution de mettre un
Mutex et de faire un wait et release dans chaque méthode.
Existe-t-il une solution autre que celle du mutex ? par exemple la class qui
s'automutex?

merci d'avance.

3 réponses

1 2
Avatar
Paul Bacelar
Pour éclaircir ;-)

http://msdn.microsoft.com/msdnmag/issues/03/01/NET/
--
Paul Bacelar

"Zazar" wrote in message
news:#

> Est-ce que du coup cela ne revient pas à utiliser un Mutex ?

Quasiment.
Les différences entre la classe Monitor et la classe Mutex sont assez
subtiles: Monitor est une classe entièrement managée, Mutex fait appel à


une
API Win32. En utilisant la classe Monitor, on a donc un code légérement


plus
performant et à priori plus portable. Mais ce n'est pas très important.

Par contre, le Monitor peut être utilisé via le mot clef lock, ce qui est
agréable car il permet d'obtenir un code plus sûr : aucun risque d'oubli


de
libération du verrou.(Remarque en passant : le lock diminue les


performances
car il crée un bloc try/catch : dans les situations où la performance est
critique, il faut garder ça à l'esprit).

Donc oui, ça revient à utiliser un Mutex (d'ailleurs le but dans les 2 cas
c'est bien d'utiliser un mutex (le nom commun)), c'est juste la manière de
le faire qui change.

--
Zazar




Avatar
adebaene
"Zazar" wrote in message news:<#...
> Est-ce que du coup cela ne revient pas à utiliser un Mutex ?

Quasiment.
Les différences entre la classe Monitor et la classe Mutex sont assez
subtiles: Monitor est une classe entièrement managée, Mutex fait appel à une
API Win32. En utilisant la classe Monitor, on a donc un code légérement plus
performant et à priori plus portable. Mais ce n'est pas très important.



Non seulement le mutex utilises du Win32 en sous-main, mais chaque
appel au mutex implique une transition en mode kernel et retour en
mode utilisateur, ce qui est nettement plus lourd qu'une gestion
d'exception ou autre. Utiliser un mutex en cas de forte contention est
donc rédibitoire en termes de perfs par rapport à une section critique
ou à un moniteur, qu fonctionne en mode user uniquement.

Par contre, le Monitor peut être utilisé via le mot clef lock, ce qui est
agréable car il permet d'obtenir un code plus sûr : aucun risque d'oubli de
libération du verrou.(Remarque en passant : le lock diminue les performances
car il crée un bloc try/catch : dans les situations où la performance est
critique, il faut garder ça à l'esprit).


La conformité et la sécurité d'un code ne devraient *jamais* être
remis en cause pour des raisons de performances ;-)

Arnaud
MVP - VC
Avatar
Zazar
Bonjour,

> Par contre, le Monitor peut être utilisé via le mot clef lock, ce qui


est
> agréable car il permet d'obtenir un code plus sûr : aucun risque d'oubli


de
> libération du verrou.(Remarque en passant : le lock diminue les


performances
> car il crée un bloc try/catch : dans les situations où la performance


est
> critique, il faut garder ça à l'esprit).
La conformité et la sécurité d'un code ne devraient *jamais* être
remis en cause pour des raisons de performances ;-)



Certes, mais écrire un code du style :
lock(locker) {
try {
} catch (...) {
} finally {
...
}
}
dans une partie de code où les performances sont critiques, c'est moyen.
Dans ce genre de situation, on dégage le lock et on écrit :
Monitor.Enter(locker);
try {
} catch (...) {
} finally {
...
Monitor.Exit(locker)
}

Je ne parlais évidemment pas de supprimer purement et simplement le bloc
try/catch pour accélerer les performances. :)

--
Zazar
1 2