首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 線程資源同步方式總結(五)——Mutex 跨進程同步與 ReaderWriterLock 讀寫分離

     編輯:關於C語言

5. Mutex:跨進程互斥體

特點:命名互斥體可跨進程/機器同步,無 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();
}

執行結果驗證

PID 4628 等待 PID 3216 釋放 Mutex

PID 3216 寫入後 PID 4628 讀取內容

第二進程阻塞於 WaitOne,第一進程寫入釋放後,第二進程獲得互斥體讀取內容。

6. ReaderWriterLock:多讀單寫

場景:頻繁讀取、偶爾寫入。讀取共享、寫入獨佔。

代碼示範


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");
    }
}

執行輸出分析

ReaderWriterLock 輸出

  • 寫入執行緒持有 WriterLock 時,所有讀取執行緒阻塞
  • 釋放 WriterLock 後,多個讀取執行緒同時獲得 ReaderLock (交錯輸出證明)
  • 無寫入時,多讀取並行無阻塞
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved