特點:命名互斥體可跨進程/機器同步,無 Wait/Pulse 機制。
static void Main(string[] args)
{
Mutex configFileMutex = new Mutex(false, "configFileMutex");
Console.WriteLine("Wait for configFileMutex Process Id: " + Process.GetCurrentProcess().Id);
configFileMutex.WaitOne();
Console.WriteLine("Enter configFileMutex Process Id: " + Process.GetCurrentProcess().Id);
Thread.Sleep(10000);
if (!File.Exists(@".config.txt"))
{
FileStream fs = File.Create(@".config.txt");
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("This is a Test!");
sw.Close(); fs.Close();
}
else
{
string[] lines = File.ReadAllLines(@".config.txt");
foreach (string line in lines) Console.WriteLine(line);
}
configFileMutex.ReleaseMutex();
configFileMutex.Close();
}


第二進程阻塞於 WaitOne,第一進程寫入釋放後,第二進程獲得互斥體讀取內容。
場景:頻繁讀取、偶爾寫入。讀取共享、寫入獨佔。
private static ReaderWriterLock m_rwl = new ReaderWriterLock();
private static int m_int = 0;
private static void Read()
{
while (true)
{
Console.WriteLine(Thread.CurrentThread.Name + " AcquireReaderLock");
m_rwl.AcquireReaderLock(10000);
Console.WriteLine("Thread: {0} Value: {1}", Thread.CurrentThread.Name, m_int);
m_rwl.ReleaseReaderLock();
}
}
private static void Writer()
{
while (true)
{
Console.WriteLine(Thread.CurrentThread.Name + " AcquireWriterLock");
m_rwl.AcquireWriterLock(1000);
Interlocked.Increment(ref m_int);
Thread.Sleep(5000);
m_rwl.ReleaseWriterLock();
Console.WriteLine(Thread.CurrentThread.Name + " ReleaseWriterLock");
}
}
