Quelle est la difference entre lock et Mutex? Pourquoi ne peuvent-ils pas être utilisés de manière interchangeable?
lock
est un mot clé du compilateur, pas une classe ou un objet réel. C'est un wrapper autour des fonctionnalités de la classe Monitor
et il est conçu pour faciliter le travail de Monitor
dans le cas habituel.
Le Monitor
(et le mot clé lock
) sont, comme Darin l’a dit, limités au AppDomain
. Principalement parce qu'une référence à une adresse mémoire (sous la forme d'un objet instancié) est nécessaire pour gérer le "verrou" et conserver l'identité du Monitor
Mutex
, d’autre part, est une enveloppe .Net entourant une structure de système d’exploitation et peut être utilisée pour la synchronisation à l’échelle du système, à l’aide de chaîne data (au lieu d’un pointeur vers data) comme identifiant. Deux mutex référençant deux chaînes dans deux adresses de mémoire complètement différentes, mais ayant le même data, utiliseront en fait le même mutex de système d'exploitation.
Un Mutex
peut être soit local à un processus ou global . MSDN :
Les mutex sont de deux types: les mutex locaux, qui ne portent pas de nom, et les mutex du système nommés. Un mutex local n'existe que dans votre processus.
De plus, vous devez faire particulièrement attention - détaillé sur la même page - lors de l’utilisation d’un mutex à l’échelle du système sur un système doté de services Terminal Server.
Une des différences entre Mutex
et lock
est que Mutex
utilise un construction de niveau noya , la synchronisation nécessitera donc toujours au moins une transition espace utilisateur-espace noyau.
lock
- c'est vraiment un raccourci vers la classe Monitor
class , essaye en revanche d'éviter d'allouer des ressources du noyau et de passer au code du noyau (et est donc plus léger et plus rapide - si l'on doit trouver une construction WinAPI à laquelle elle ressemble, ce serait CriticalSection
).
L’autre différence est ce que d’autres soulignent: un nommé Mutex
peut être utilisé dans tous les processus.
Sauf si vous avez des besoins particuliers ou une synchronisation entre les processus, il est préférable de vous en tenir à lock
(ou Monitor
)
Il existe plusieurs autres différences "mineures", telles que la manière dont l'abandon est géré, etc.
On peut dire la même chose de ReaderWriterLock
et ReaderWriterLockSlim
dans 3.5, Semaphore
et de la nouvelle SemaphoreSlim
dans .NET 4.0, etc. C'est vrai que ces dernières xxSlim
classes ne peuvent pas être utilisées comme primitives de synchronisation à l'échelle du système, mais elles n'ont jamais été conçues pour - elles étaient "uniquement" censées être plus rapides et plus respectueuses des ressources.
J'utilise un mutex pour vérifier si j'ai déjà une copie de l'application en cours d'exécution sur le même ordinateur.
bool firstInstance;
Mutex mutex = new Mutex(false, @"Local\DASHBOARD_MAIN_APPLICATION", out firstInstance);
if (!firstInstance)
{
//another copy of this application running
}
else
{
//run main application loop here.
}
// Refer to the mutex down here so garbage collection doesn't chuck it out.
GC.KeepAlive(mutex);
Mutex est un processus croisé et il y aura un exemple classique de ne pas exécuter plus d'une instance d'une application.
Le deuxième exemple est que vous avez un fichier et que vous ne voulez pas qu'un processus différent accède au même fichier, vous pouvez implémenter un Mutex mais rappelez-vous une chose. Mutex est un système d'exploitation et ne peut pas être utilisé entre deux processus distants.
Le verrouillage est le moyen le plus simple de protéger une partie de votre code et il est spécifique à une application. Vous pouvez le remplacer par Moniteurs si vous souhaitez une synchronisation plus contrôlée.
Beaucoup a déjà été dit, mais pour simplifier, voici ce que je pense.
verrouiller -> Simple à utiliser, wrapper sur le moniteur, verrouille les threads dans un AppDomain.
mutex non nommé -> similaire à verrouiller sauf que le périmètre de verrouillage est plus complexe et qu'il est utilisé dans AppDomain dans un processus.
Nommé mutex -> le périmètre de verrouillage est encore plus qu'un mutex sans nom et qu'il fait partie d'un processus dans un système d'exploitation.
Alors maintenant, les options sont là, vous devez choisir celui qui convient le mieux à votre cas.