web-dev-qa-db-fra.com

Quelle est la difference entre lock et Mutex?

Quelle est la difference entre lock et Mutex? Pourquoi ne peuvent-ils pas être utilisés de manière interchangeable?

115
Ram

Un verro est spécifique à l'AppDomain, tandis que Mutex au système d'exploitation vous permet d'effectuer le verrouillage et la synchronisation interprocessus (IPC).

130
Darin Dimitrov

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.

86
Toby

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.

49
Andras Vass

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);
22
Jonathan

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.

6
TalentTuner

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.

5
Prakash Tripathi