程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 多線程編程之鎖的使用【互斥鎖(lock)和讀寫鎖(ReadWriteLock)】

C# 多線程編程之鎖的使用【互斥鎖(lock)和讀寫鎖(ReadWriteLock)】

編輯:C#入門知識

今天主要介紹下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();
                }
            }
        }
    }
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved