多線程中鎖的使用


本文轉自:http://www.2cto.com/kf/201401/274446.html

主要介紹下C#的兩種鎖:互斥鎖(lock)和讀寫鎖(ReadWriteLock)

互斥鎖(lock)

lock 關鍵字將語句塊標記為臨界區,方法是獲取給定對象的互斥鎖,執行語句,然后釋放該鎖。當任何一個線程獲取到鎖后,其他線程如果需要使用該臨界區內代碼,則必須等待前一個線程使用完畢后釋放鎖。

代碼示例:

Object thisLock = new Object();
lock (thisLock)
{
// 臨界區代碼塊
}

 

讀寫鎖(ReadWriteLock)

ReadWriteLock定義支持單個寫線程和多個讀線程的鎖。該鎖的作用主要是解決並發讀的性能問題,使用該鎖,可以大大提高數據並發訪問的性能,只有在寫時,才會阻塞所有的讀鎖。


示例代碼:

using System.Collections.Generic;
using System.Windows;
using System.Threading;


namespace FYSTest
{
  public partial class MainWindow : Window
  {
    List list = new List();
    private ReaderWriterLock _rwlock = new ReaderWriterLock();

    public MainWindow()
    {
      InitializeComponent();
      Thread ThRead = new Thread(new ThreadStart(Read));
      ThRead.IsBackground = true;
      Thread ThRead2 = new Thread(new ThreadStart(Read));
      ThRead2.IsBackground = true;
      Thread ThWrite = new Thread(new ThreadStart(Write));
      ThWrite.IsBackground = true;
      ThRead.Start();
      ThRead2.Start();
      ThWrite.Start();
    }

    private void Read()
    {
      while (true)
      {
        //使用一個 System.Int32 超時值獲取讀線程鎖。
        _rwlock.AcquireReaderLock(100);
        try
        {
          if (list.Count > 0)
          {
            int result = list[list.Count - 1];
          }
        }
        finally
        {
          //減少鎖計數,釋放鎖
          _rwlock.ReleaseReaderLock();
        }
      }
    }

    int WriteCount = 0;//寫次數
    private void Write()
    {
      while (true)
      {
        //使用一個 System.Int32 超時值獲取寫線程鎖。
        _rwlock.AcquireWriterLock(100);
        try
        {
          list.Add(WriteCount++);
        }
        finally
        {
          //減少寫線程鎖上的鎖計數,釋放寫鎖
          _rwlock.ReleaseWriterLock();
        }
      }
    }
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM