Quelle est la différence entre lock et Mutex?

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

Un verrou est spécifique à AppDomain, tandis que Mutex au système d’exploitation vous permet d’effectuer un locking et une synchronisation inter-processus (IPC).

lock est un mot-clé du compilateur, pas une classe ou un object réel. Il s’agit d’une enveloppe autour des fonctionnalités de la classe Monitor et conçue pour faciliter l’utilisation du Monitor dans le cas le plus courant.

Le Monitor (et le mot-clé de lock ) sont, comme dit Darin, limités à AppDomain . Principalement parce qu’une référence à une adresse mémoire (sous la forme d’un object instancié) est nécessaire pour gérer le “verrou” et conserver l’identité du Monitor

Le Mutex , quant à lui, est un wrapper .Net autour d’une construction de système d’exploitation et peut être utilisé pour une synchronisation à l’échelle du système, en utilisant des données de chaîne (au lieu d’un pointeur vers des données) comme identifiant. Deux mutex qui référencent deux chaînes dans deux adresses mémoire complètement différentes, mais ayant les mêmes données , utiliseront en réalité le même mutex du système d’exploitation.

Un Mutex peut être soit local à un processus, soit à l’échelle du système . MSDN :

Les mutex sont de deux types: les mutex locaux, qui sont non 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 sur la même page) lors de l’utilisation d’un mutex à l’échelle du système sur un système doté des services Terminal Server.

Une des différences entre Mutex et lock est que Mutex utilise une construction de niveau kernel , donc la synchronisation nécessitera toujours au moins une transition d’espace utilisateur-kernel.

lock – qui est vraiment un raccourci vers la classe Monitor , tente d’éviter d’allouer les ressources du kernel et de passer au code du kernel (et donc plus simple et plus rapide – si l’on doit trouver une construction WinAPI qui lui ressemble, ce sera CriticalSection ).

L’autre différence est ce que les autres soulignent: un Mutex nommé peut être utilisé entre les processus.

À moins que vous ayez des besoins particuliers ou que vous ayez besoin d’une synchronisation entre les processus, il est préférable de vous en tenir au lock (aka Monitor ) ˛

Il existe plusieurs autres différences “mineures”, comme la gestion de l’abandon, etc.

On peut dire la même chose à propos de ReaderWriterLock et ReaderWriterLockSlim dans 3.5, Semaphore et le nouveau SemaphoreSlim dans .NET 4.0, etc. Il est vrai que les dernières classes xxSlim ne peuvent pas être utilisées comme primitives de étaient “seulement” censés être plus rapides et plus conviviaux.

J’utilise un Mutex pour vérifier si j’ai déjà une copie de l’application exécutée 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 que Mutex est un système d’exploitation complet et impossible entre deux processus distants.

Lock est le moyen le plus simple de protéger la section de votre code et il est spécifique à l’application, vous pouvez remplacer le locking par des moniteurs si vous souhaitez davantage de synchronisation contrôlée.

Beaucoup a déjà été dit, mais pour simplifier, voici ma prise.

lock -> Simple à utiliser, encapsuleur sur moniteur, verrouille les threads dans un AppDomain.

Mutex sans nom -> similaire au locking, sauf que l’étendue du locking est plus importante et qu’elle est intégrée à AppDomain dans un processus.

Nommé mutex -> la scope de locking est encore plus qu’un mutex sans nom et est à travers le processus dans un système d’exploitation.

Alors maintenant, les options sont là, vous devez choisir celui qui convient le mieux à votre cas.