Mutex in .NET

In this article you will learn about Mutex in .Net.

Mutex means mutual exclusion. Mutex is a class in .NET framework. It is thread synchronization process. Mutex is used to prevent the execution of a shared resource by multiple threads. It allows only one single thread to enter to execute a particular task. It is used in single process or multiple processes. It can also be used for interprocess synchronization. Monitor/Lock prevents shared resource from internal threads, but Mutex prevent from both internal as well as external threads. In another way we can say, mutex provide thread safety against internal/external threads.
 
Example: Multiple threads are writing to file in this example.

I have synchronized multiple thread using mutex. Only one thread is accessing shared resource (file here) at a time.
  1. using System;  
  2. using System.Threading;  
  3. using System.IO;  
  4.   
  5. class ConsoleApplication1   
  6. {  
  7.     static void Main(string[] args)   
  8.   {  
  9.         for (int i = 0; i < 5; i++)  
  10.         {  
  11.             Thread thread = new Thread(new ThreadStart(Go));  
  12.             thread.Name = String.Concat("Thread ", i);  
  13.             thread.Start();  
  14.         }  
  15.         Console.ReadLine();  
  16.     }  
  17.   
  18.     static void Go()  
  19.     {  
  20.         Thread.Sleep(500);  
  21.         WriteFile();  
  22.     }  
  23.   
  24.     static Mutex mutex = new Mutex();  
  25.     static void WriteFile()  
  26.     {  
  27.         mutex.WaitOne();  
  28.   
  29.         String ThreadName = Thread.CurrentThread.Name;  
  30.         Console.WriteLine("{0} using resource", ThreadName);  
  31.   
  32.         try   
  33.         {  
  34.             using(StreamWriter sw = new StreamWriter("C:\\abc.txt"true))   
  35.             {  
  36.                 sw.WriteLine(ThreadName);  
  37.             }  
  38.         } catch (Exception ex)  
  39.         {  
  40.             Console.WriteLine(ex.Message);  
  41.         }  
  42.   
  43.         Console.WriteLine("{0} releasing resource", ThreadName);  
  44.   
  45.         mutex.ReleaseMutex();  
  46.     }  
output
 
Handling single Instance of Application:
  1. namespace ConsoleApplication1  
  2. {  
  3.     class SingleInstance   
  4.     {  
  5.         static void Main(string[] args)  
  6.       {  
  7.             String appGUID = ”5 a913d2e - 1 d4b - 492 c - a408 - df315ca3de93”;  
  8.             bool ok;  
  9.             Mutex mutex = new System.Threading.Mutex(true, appGUID, out ok);  
  10.   
  11.             if (!ok)  
  12.             {  
  13.                 Console.WriteLine("Another instance is already running.");  
  14.             } else  
  15.             {  
  16.                 Console.WriteLine("Single instance is running.");  
  17.             }  
  18.             Console.ReadLine();  
  19.         }  
  20.     }  
  21. }  
When application will be launched first time, you can see the following message.

message
 
When application is launched more than 1 times then you will see the following message.

message

Note:
  1. The name of the mutex should be a unique identifier of assembly or GUID.
  2. Mutex hits performance, so it should be used when synchronization across process boundaries is required.