Quelle est la différence entre lock et Mutex ? Pourquoi ne peuvent-ils pas être utilisés de manière interchangeable ?
Réponses
Trop de publicités?lock
est un mot-clé du compilateur, et non une classe ou un objet réel. Il s'agit d'une enveloppe autour de la fonctionnalité de l'objet Monitor
et est conçu pour que la classe Monitor
plus facile à travailler dans le cas courant.
Le site Monitor
(et le lock
) sont, comme l'a dit Darin, limités à l'élément 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 maintenir l'identité de l'utilisateur. Monitor
Le site Mutex
D'autre part, il s'agit d'une enveloppe .Net autour d'une construction du système d'exploitation, qui peut être utilisée pour la synchronisation à l'échelle du système, en utilisant des chaînes de caractères. données (au lieu d'un pointeur vers des données) comme identifiant. Deux mutex qui référencent deux chaînes de caractères dans deux adresses mémoire complètement différentes, mais ayant le même identifiant données utiliseront en fait le même mutex du système d'exploitation.
A Mutex
peut être soit local à un processus ou à l'échelle du système . MSDN :
Les mutex sont de deux types : les mutex locaux, qui ne sont pas nommés, et les mutex système nommés. Un mutex local n'existe que dans votre processus.
En outre, il convient de prendre des précautions particulières - détaillées également sur la même page - lors de l'utilisation d'un mutex à l'échelle du système sur un système équipé de Terminal Services.
L'une des différences entre Mutex
y lock
c'est que Mutex
utilise un construction au niveau du noyau La synchronisation nécessitera donc toujours au moins une transition entre l'espace utilisateur et l'espace noyau.
lock
- qui est en fait un raccourci vers le Monitor
classe D'un autre côté, l'architecture WinAPI essaie d'éviter l'allocation de ressources du noyau et la transition vers le code du noyau (et est donc plus légère et plus rapide). CriticalSection
).
L'autre différence est ce que d'autres soulignent : une nommé Mutex
peut être utilisé dans tous les processus.
À moins d'avoir des besoins particuliers ou d'exiger une synchronisation entre les processus, il est préférable de s'en tenir à l'option lock
(alias Monitor
)
Il existe plusieurs autres différences "mineures", comme la façon dont l'abandon est traité, etc.
On peut dire la même chose de ReaderWriterLock
y ReaderWriterLockSlim
en 3.5, Semaphore
et le nouveau SemaphoreSlim
dans .NET 4.0, etc. Il est vrai que ces derniers xxSlim
ne peuvent pas être utilisées comme primitives de synchronisation à l'échelle du système, mais elles n'ont jamais été conçues pour cela - elles étaient "seulement" destiné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 qui tourne sur la même machine.
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.
Deuxième exemple : disons que vous avez un fichier et que vous ne voulez pas que différents processus accèdent au même fichier, vous pouvez mettre en œuvre un Mutex mais rappelez-vous une chose : le Mutex est un système d'exploitation et ne peut pas être utilisé entre deux processus distants.
Lock est le moyen le plus simple de protéger une section de votre code et il est spécifique à votre domaine d'application. Vous pouvez remplacer lock par Moniters si vous souhaitez une synchronisation plus contrôlée.