163 votes

Quelle est la différence entre un verrou et un Mutex ?

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

180voto

Darin Dimitrov Points 528142

A serrure est spécifique au AppDomain, alors que Mutex au système d'exploitation, ce qui vous permet d'effectuer un verrouillage et une synchronisation interprocessus (IPC).

115voto

Toby Points 4112

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.

60voto

Andras Vass Points 8021

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.

33voto

Jonathan Points 6934

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

9voto

Saurabh Points 11097

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X