亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

深入多線程之:Reader與Write Locks(讀寫鎖)的使用詳解

2020-01-24 03:19:53
字體:
來源:轉載
供稿:網友

線程安全的一個很經常的需求是允許并發讀,但是不允許并發寫,例如對于文件就是這樣的。

ReaderWriterLockSlim 在.net framework 3.5的時候就提供了,它是用來代替以前的”fat”版本的”ReaderWriterLock”

這兩個類,有兩種基本的鎖----一個讀鎖,一個寫鎖。

寫鎖是一個完全排他鎖。

讀鎖可以和其他的讀鎖兼容


因此當一個線程持有寫鎖的是很,所有的嘗試獲取讀鎖和寫鎖的線程全部阻塞,但是如果沒有一個線程持有寫鎖,那么可以有一系列的線程并發的獲取讀鎖。

ReaderWriterLockSlim 定義了下面幾個方法來獲取和釋放 讀寫鎖。

    Public void EnterReadLock();
    Public void ExitReadLock();
    Public void EnterWriteLock();
    Public void ExitWriteLock();

和Monitor.TryEnter類似,ReaderWriterLockSlim 再對應的”EnterXXX”方法上也提供了相應的”Try”版本。ReaderWriterLock提供了AcquireXXX 和 ReleaseXXX 方法,當超時發生了,ReaderWriterLock 拋出一個ApplicationException,而不是返回false。

復制代碼 代碼如下:

static readonly ReaderWriterLockSlim _rw = new ReaderWriterLockSlim();
        static List<int> _items = new List<int>();
        static Random _rand = new Random();

        public static void Main()
        {
            ///三個讀線程
            new Thread(Read).Start();
            new Thread(Read).Start();
            new Thread(Read).Start();

            //兩個寫線程
            new Thread(Write).Start("A");
            new Thread(Write).Start("B");
        }

        static void Read()
        {
            while (true)
            {
                _rw.EnterReadLock();//獲取讀鎖
                //模擬讀的過程
                foreach (int i in _items)
                    Thread.Sleep(100);
                _rw.ExitReadLock();//釋放讀鎖
            }
        }

        static void Write(object threadID)
        {
            while (true)
            {
                Console.WriteLine(_rw.CurrentReadCount + " concurrent readers");

                int newNumber = GetRandomNum(100);

                _rw.EnterWriteLock(); //獲取寫鎖
                _items.Add(newNumber); //寫數據
                _rw.ExitWriteLock();  //釋放寫鎖
                Console.WriteLine("Thread " + threadID + " added " + newNumber);

                Thread.Sleep(100);
            }
        }

        //獲取隨機數
        static int GetRandomNum(int max) { lock (_rand) return _rand.Next(max); }


再實際的發布版本中,最好使用try/finally 來確保即使異常拋出了,鎖也被正確的釋放了。

CurrentReadCount 屬性,ReaderWriterLockSlim 提供了以下屬性用來監視鎖。

可更新鎖:

再一個原子操作里將讀鎖升級為寫鎖是很有用的,例如,假設你想要再一個list 里面寫一些不存在的項的時候, 你可能會執行下面的一些步驟:

    獲取一個讀鎖。
    測試,如果要寫的東西在列表中,那么釋放鎖,然后返回。
    釋放讀鎖。
    獲取一個寫鎖
    添加項,寫東西,
    釋放寫鎖。

問題是:在第三步和第四步之間,可能有另一個線程修改了列表。

ReaderWriterLockSlim 通過一個叫做可更新鎖( upgradeable lock),來解決這個問題。

一個可更新鎖除了它可以在一個原子操作中變成寫鎖外很像一個讀鎖,你可以這樣使用它:

    調用EnterUpgradeableReadLock 獲取可更新鎖。執行一些讀操作,例如判斷要寫的東西在不在List中。調用EnterWriteLock , 這個方法會將可更新鎖 升級為 寫鎖。執行寫操作,調用ExitWriteLock 方法,這個方法將寫鎖轉換回可更新鎖。繼續執行一些讀操作,或什么都不做。
    調用ExitUpgradeableReadLock 釋放可更新鎖。

從調用者的角度來看,它很像一個嵌套/遞歸鎖,從功能上講,在第三步,

ReaderWriterLockSlim 在一個原子操作里面釋放讀鎖,然后獲取寫鎖。

可更新鎖和讀鎖的重要區別是:盡管可更新鎖可以和讀鎖共存,但是一次只能有一個可更新鎖被獲取。這樣的主要目的是防止死鎖。

這樣我們可以修改Write方法,讓它可以添加一些不在列表中的Item。

復制代碼 代碼如下:

static void Write(object threadID)
        {
            while (true)
            {
                Console.WriteLine(_rw.CurrentReadCount + " concurrent readers");

                int newNumber = GetRandomNum(100);

                _rw.EnterUpgradeableReadLock(); //獲取可更新鎖
                if (!_items.Contains(newNumber)) //如果要寫的東西不在列表中
                {
                    _rw.EnterWriteLock(); //可更新鎖變成寫鎖
                    _items.Add(newNumber); //寫東西
                    _rw.ExitWriteLock(); //重新變回可更新鎖
                    Console.WriteLine("Thread " + threadID + " added " + newNumber); //讀數據
                }
                _rw.ExitUpgradeableReadLock(); //退出可更新鎖

                Thread.Sleep(100);
            }
        }


從上面的例子可以看到C#提供的讀寫鎖功能強大,使用方便,

所以在自己編寫讀寫鎖的時候,要考慮下是否需要支持可更新鎖,是否有必要自己寫一個讀寫鎖.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩电影免费观看在线| 57pao成人国产永久免费| 81精品国产乱码久久久久久| 国产精品自拍视频| 日韩在线视频中文字幕| xvideos成人免费中文版| 日韩国产欧美区| 一区二区三区四区在线观看视频| 久久精品国产96久久久香蕉| 这里只有精品在线观看| 午夜精品福利在线观看| 亚洲区在线播放| 精品久久久久久久大神国产| 国产精品自产拍高潮在线观看| 夜夜嗨av色一区二区不卡| 国产精品美女免费视频| 国产成人精彩在线视频九色| 亚洲第一中文字幕在线观看| 久久人人爽人人爽人人片av高请| 欧美性在线视频| 欧美成人午夜剧场免费观看| 国产精自产拍久久久久久蜜| 中文字幕久热精品视频在线| 日韩在线观看免费av| 青青久久av北条麻妃海外网| 欧美在线亚洲在线| 在线成人中文字幕| 精品成人av一区| 精品久久久久久久久久久久久久| 中文字幕欧美日韩精品| 超碰日本道色综合久久综合| 2023亚洲男人天堂| 日本精品一区二区三区在线| 国产精品日韩电影| 亚洲欧美另类人妖| 国产精品第二页| 国产在线视频不卡| 8090成年在线看片午夜| 91日韩在线播放| 韩国三级电影久久久久久| 成人a免费视频| 91亚洲精品一区| 亚洲精品动漫100p| 午夜伦理精品一区| 日本乱人伦a精品| 欧美在线视频观看免费网站| 国产精品久久久久久久久免费看| 亚洲人成在线播放| 成人妇女免费播放久久久| 日韩精品视频观看| 2019最新中文字幕| 日韩视频免费在线观看| 日韩电影在线观看中文字幕| 26uuu日韩精品一区二区| 中文字幕在线视频日韩| 日韩精品免费在线视频观看| 日韩美女中文字幕| 亚洲精品影视在线观看| 欧美一区二区三区……| 亚洲电影免费观看| 91国产高清在线| 亚洲乱码一区二区| 91po在线观看91精品国产性色| 日本精品一区二区三区在线| 国产精品∨欧美精品v日韩精品| 国产欧美日韩亚洲精品| 日本中文字幕成人| 日韩亚洲欧美中文高清在线| 亚洲一区中文字幕在线观看| 国产三级精品网站| 欧美日韩国产精品一区二区不卡中文| 国产精品影院在线观看| 欧美韩日一区二区| 日韩在线视频中文字幕| 欧美视频免费在线| 久久国产精品久久精品| 在线播放日韩专区| 日韩视频―中文字幕| 在线观看91久久久久久| 欧美午夜视频一区二区| 国产精品久久久久久久电影| 韩剧1988在线观看免费完整版| 欧美乱妇高清无乱码| 久久久精品美女| 亚洲一区二区三区视频| 91在线观看免费高清完整版在线观看| 91色琪琪电影亚洲精品久久| 欧美中文字幕在线视频| 国产精品美女无圣光视频| 亚洲第一网站男人都懂| 精品无人国产偷自产在线| 国产精品偷伦免费视频观看的| 91国产美女在线观看| 乱亲女秽乱长久久久| 永久免费精品影视网站| 欧美激情在线有限公司| 精品视频在线导航| 欧美日韩视频免费播放| 国产91ⅴ在线精品免费观看| 成人精品久久一区二区三区| 欧美做爰性生交视频| 日韩av中文字幕在线免费观看| 国产91精品久久久久久久| 北条麻妃99精品青青久久| 日韩亚洲欧美成人| 国产91网红主播在线观看| 98视频在线噜噜噜国产| 97国产在线视频| 色婷婷av一区二区三区在线观看| 欧美精品18videos性欧| 久久精品成人欧美大片| 欧美国产日本高清在线| 69精品小视频| 日韩精品极品毛片系列视频| www.欧美免费| 欧美一区二区三区精品电影| 97在线观看视频国产| 亚洲成人中文字幕| 欧洲永久精品大片ww免费漫画| 日韩精品视频在线播放| 成人免费高清完整版在线观看| 91精品久久久久久久久久入口| 中文字幕一区日韩电影| 精品中文字幕在线观看| 久久久伊人日本| 国产日韩精品视频| 国产精品一区二区久久久久| 成人国产精品免费视频| 精品福利视频导航| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲精品欧美日韩| 亚洲天堂成人在线视频| 亚洲日韩欧美视频| 欧美激情一区二区三区高清视频| 久久中文字幕视频| 影音先锋欧美在线资源| 亚洲欧美精品一区二区| 在线播放国产一区二区三区| 久久精品国产96久久久香蕉| 欧美久久精品午夜青青大伊人| 国产精品久久久久久久久久久不卡| 国产精品99久久久久久久久久久久| 国产精品999999| 丝袜一区二区三区| 精品亚洲一区二区三区在线观看| 国产精品久久久久久久久久久不卡| 日韩av日韩在线观看| 国产91在线播放精品91| 国产一区视频在线播放| 国产一区二区av| 国产精品影片在线观看| 精品亚洲一区二区三区| 97视频在线观看成人| 亚洲精品免费一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一| 8x海外华人永久免费日韩内陆视频| 精品二区三区线观看| 日本久久中文字幕| 国产精品免费久久久久久| 欧美亚洲一区在线| 亚洲天堂第一页| 欧美日韩国产精品一区二区不卡中文| 一本色道久久综合狠狠躁篇怎么玩| 欧美韩国理论所午夜片917电影|