25 Возможности библиотеки Task Parallel Library. Mutex

Объект Mutex используется, как и Monitor, для обеспечения взаимно-исключительного доступа к фрагменту кода. В основе объекта Mutex лежит вызов функции ядра операционной системы, и поэтому блокировка с помощью Mutex является менее эффективной по сравнению с классом Monitor и конструкцией lock.

Отличие от Monitor заключается в возможности использования глобальных именованных блокировок, доступных в рамках нескольких приложений. Таким образом, с помощью объекта Mutex можно организовать синхронизацию нескольких приложений. Ядро операционной системы контролирует взаимную исключительность выполнения критических секций. Одним из примеров использования межпроцессной синхронизации является контроль количества запущенных копий приложения.


class MyApplication 
{ 
  static void Main() 
  { 
    var mutex = new Mutex(false, "MyApp ver 2.0"); 

    if(!mutex.WaitOne(TimeSpan.FromSeconds(5), false)) 
    { 
      Console.WriteLine("Приложение уже запущено"); 
      return; 
    } 
    Run(); 
    mutex.Dispose(); 
  }   

  static void Run () 
  {   
    Console.WriteLine("Welcome to MyApp ver 2.0"); 
    .. 
  } 
} 
  
В этом фрагменте создается "именованный" мьютекс. Вызов метода WaitOne позволяет одному потоку или процессу войти в критическую секцию. Вызов метода WaitOne для дополнительных копий приложения возвращает признак занятости критической секции. По этому признаку приложение распознает факт, что копия уже запущена. Временной интервал в 5с используется для случаев, если запущенное приложение завершает выполнение. Освобождение мьютекса не выполняется, так как нет необходимости передавать управление другому процессу. Второй аргумент в вызове WaitOne указывает, что используется ожидание глобального мьютекса.