Когда же в коде больше не требуется владеть мьютексом, он освобождается посредством вызова метода
ReleaseMutex , форма которого приведена ниже.public void ReleaseMutex
В этой форме метод
ReleaseMutex освобождает мьютекс, для которого он был вызван, что дает возможность другому потоку получить данный мьютекс.Для применения мьютекса с целью синхронизировать доступ к общему ресурсу упомянутые выше методы
WaitOne иReleaseMutex используются так, как показано в приведенном ниже фрагменте кода.Mutex myMtx = new Mutex;
//
...myMtx.WaitOne ; // ожидать получения мьютекса // Получить доступ к общему ресурсу.
myMtx.ReleaseMutex; // освободить мьютекс
При вызове метода
WaitOne выполнение соответствующего потока приостанавливается до тех пор, пока не будет получен мьютекс. А при вызове методаReleaseMutex мьютекс освобождается и затем может быть получен другим потоком. Благодаря такому подходу к синхронизации одновременный доступ к общему ресурсу ограничивается только одним потоком.В приведенном ниже примере программы описанный выше механизм синхронизации демонстрируется на практике. В этой программе создаются два потока в виде классов
IncThreadn DecThread,которым требуется доступ к общему ресурсу: переменнойSharedRes . Count.В потокеIncThreadпеременнаяSharedRes . Countинкрементируется, а в потокеDecThread— декрементируется. Во избежание одновременного доступа обоих потоков к общему ресурсуSharedRes . Countэтот доступ синхронизируется мьютексомMtx,также являющимся членом классаSharedRes.// Применить мьютекс.
using System;
using System.Threading;
//В этом классе содержится общий ресурс(переменная Count),
// а также мьютекс (Mtx), управляющий доступом к ней. class SharedRes {
public static int Count = 0;
public static Mutex Mtx = new Mutex;
}
// В этом потоке переменная SharedRes.Count инкрементируется, class IncThread { int num;
public Thread Thrd;
public IncThread(string name, int n) {
Thrd = new Thread(this.Run); num = n;
Thrd.Name = name;
Thrd.Start;
}
// Точка входа в поток, void Run {
Console.WriteLine(Thrd.Name + " ожидает мьютекс.");
// Получить мьютекс.
SharedRes.Mtx.WaitOne;
Console.WriteLine(Thrd.Name + " получает мьютекс."); do {
Thread.Sleep (500);
SharedRes.Count++;
Console.WriteLine("В потоке " + Thrd.Name +
", SharedRes.Count = " + SharedRes.Count);
num— ;
} while(num > 0);
Console.WriteLine(Thrd.Name + " освобождает мьютекс.");
// Освободить мьютекс.
SharedRes.Mtx.ReleaseMutex;
}
}
// В этом потоке переменная SharedRes.Count декрементируется, class DecThread { int num;
public Thread Thrd;