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

首頁 > 學院 > 開發設計 > 正文

細說.NET中的多線程(四使用鎖進行同步)

2019-11-14 13:50:52
字體:
來源:轉載
供稿:網友

通過鎖來實現同步

排它鎖主要用來保證,在一段時間內,只有一個線程可以訪問某一段代碼。兩種主要類型的排它鎖是lock和Mutex。Lock和Mutex相比構造起來更方便,運行的也更快。但是Mutex可以在同一個機器上的不同進程使用。

Monitor.Enter和Monitor.Exit

C#中的lock關鍵字,實際上是Monitor.Enter,Monitor.Exist的一個簡寫。在.NET 1.0,2.0,3.0 版本的c#中,lock會被編譯成如下代碼:

        Monitor.Enter(_locker);        try        {            if (_val2 != 0) Console.WriteLine(_val1 / _val2);            _val2 = 0;        }        finally { Monitor.Exit(_locker); }

如果你沒有調用Monitor.Enter而直接調用Monitor.Exit會引發異常。

LockTaken版本:

想象一下上面這段代碼,如果再Monitor.Enter之后,try之前,線程出現了異常(比如被終止),在這種情況下,finally中的Exit方法就永遠不會被執行,也就導致了這個鎖不會被釋放。為了避免這種情況,CLR 4.0的設計者重載了Monitor.Enter方法:

public static void Enter (object obj, ref bool lockTaken);

 

如果當前線程由于某些異常導致鎖沒有被獲取到,lockTake值會為false,因此在CLR 4.0中,lock會被解釋成如下代碼:

        bool lockTaken = false;        try        {            Monitor.Enter(_locker, ref lockTaken);            // Do your stuff...        }        finally { if (lockTaken) Monitor.Exit(_locker); }

TryEnter

Monitor也提供了了一個TryEnter方法,允許你設置一個超時時間,避免當前線程長時間獲取不到鎖而一直等待。

選擇正確的同步對象

你需要選擇一個對所有線程都可見的對象進行lock(obj)來確保程序能夠按照你的意圖執行。如果比不了解C#語言中的某些特性,lock可能不會按照你 期望來執行。

  1. 由于字符串的駐留機制,lock("string")不是一個好的選擇
  2. Lock一個值類型不是一個好的選擇
  3. Lock(typeof(..))不是一個好的選擇,因為System.Type的特性

什么時候使用lock

一個基本的規則,你需要對任意的寫操作,或者可修改的字段進行lock。即使是一個賦值操作,或者累加操作,你也不能假設他是線程安全的。

例如下面代碼不是線程安全的:

        class ThreadUnsafe        {            static int _x;            static void Increment() { _x++; }            static void Assign() { _x = 123; }        }

 

你需要這樣寫:

        class ThreadSafe        {            static readonly object _locker = new object();            static int _x;            static void Increment() { lock (_locker) _x++; }            static void Assign() { lock (_locker) _x = 123; }        }

如果你看過一些BCL類庫里面的實現,你可以能會發現,某些情況下會使用InterLocked類,而不是lock,我們會在后面介紹。

關于嵌套鎖或者reentrant

你在閱讀一些文檔的時候,有的文檔可能會說lock或者Monitor.Enter是reentrant(可重入的),那么我們如何理解reentrant呢?

想象下以下代碼:

            lock (locker)                lock (locker)                    lock (locker)                    {                        // Do something...                    }

 

或者是:

            Monitor.Enter(locker); Monitor.Enter(locker); Monitor.Enter(locker);            // Do something...            Monitor.Exit(locker); Monitor.Exit(locker); Monitor.Exit(locker);

這種情況下,只有在最后一個exit執行后,或者執行了相應次數的Exit后,locker才是可獲取的狀態。

Mutex

Mutex像c#中的lock一樣,但是在不同的進程中仍然可以使用。換句話說,Mutex是一個計算機級別的鎖。因此獲取這樣一個鎖要比Monitor慢很多。

示例代碼:

 

using System;using System.Threading.Tasks;using System.Threading;namespace MultiThreadTest{    class OneAtATimePlease    {        static void Main()        {            // Naming a Mutex makes it available computer-wide. Use a name that's            // unique to your company and application (e.g., include your URL).            using (var mutex = new Mutex(false, "oreilly.com OneAtATimeDemo"))            {                // Wait a few seconds if contended, in case another instance                // of the PRogram is still in the process of shutting down.                if (!mutex.WaitOne(TimeSpan.FromSeconds(3), false))                {                    Console.WriteLine("Another app instance is running. Bye!");                    return;                }                RunProgram();            }        }        static void RunProgram()        {            Console.WriteLine("Running. Press Enter to exit");            Console.ReadLine();        }    }}

Semaphore

Monitor和Mutex都是排他鎖,Semaphore我們常用的另外一種非排他的鎖。

我們用它來實現這樣一個例子:一個酒吧,最多能容納3人,如果客滿則需要等待,有客人離開,等待的人隨時可以進來。

示例代碼:

using System;using System.Threading;class TheClub      // No door lists!{    static Semaphore _sem = new Semaphore(3, 3);    // Capacity of 3    static void Main()    {        for (int i = 1; i <= 5; i++) new Thread(Enter).Start(i);        Console.ReadLine();    }    static void Enter(object id)    {        Console.WriteLine(id + " wants to enter");        _sem.WaitOne();        Console.WriteLine(id + " is in!");           // Only three threads        Thread.Sleep(1000 * (int)id);               // can be here at        Console.WriteLine(id + " is leaving");       // a time.        _sem.Release();    }}

 

使用Semaphore需要調用者來控制訪問資源,調用WaitOne來獲取資源,通過Release來釋放資源。開發者有責任確保資源能夠正確釋放。

Semaphore在限制同步訪問的時候非常有用,它不會像Monitor或者Mutex那樣當一個線程訪問某些資源時,其它所有線程都需要等,而是設置一個緩沖區,允許最多多少個線程同時進行訪問。

Semaphore也可以像Mutex一樣,跨進程進行同步。

 

本節主要總結了使用鎖進行同步,下一節將總結使用信號量進行同步。      


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区美女视频| 亚洲xxx自由成熟| 亚洲精品久久久久久久久久久久| 91国自产精品中文字幕亚洲| xxxx欧美18另类的高清| 97香蕉久久超级碰碰高清版| 欧美大片在线看| 精品国产91乱高清在线观看| 欧美激情aaaa| 一本色道久久88亚洲综合88| 91九色视频在线| 亚洲精品久久久久中文字幕欢迎你| 欧美大片在线影院| 欧美性猛交xxxxx水多| 国内免费久久久久久久久久久| 欧美大片在线免费观看| 亚洲女人天堂色在线7777| 欧美精品中文字幕一区| 日本不卡免费高清视频| 在线免费观看羞羞视频一区二区| 91精品视频在线| 欧美日韩国产麻豆| 日韩欧美国产高清91| 欧美激情在线观看视频| 国产亚洲激情在线| 日韩男女性生活视频| 久久久久亚洲精品国产| 国产精品国产自产拍高清av水多| 91欧美精品午夜性色福利在线| 国产精选久久久久久| 久久久国产精品x99av| 日产精品99久久久久久| 日韩高清有码在线| 日本精品久久中文字幕佐佐木| 98午夜经典影视| 欧美影院成年免费版| 欧美成人精品在线观看| 日韩电影中文字幕在线| 久久免费视频这里只有精品| 中文字幕少妇一区二区三区| 久久精品国产96久久久香蕉| 日韩欧美国产骚| 成人免费观看49www在线观看| 亚洲人成电影网站| 成人黄色免费网站在线观看| 日韩有码在线播放| 91精品国产91久久久久| 成人激情综合网| 国产va免费精品高清在线| 自拍偷拍亚洲一区| 亚洲色图欧美制服丝袜另类第一页| 欧美日韩亚洲视频一区| 欧美国产亚洲视频| 色偷偷亚洲男人天堂| 欧美专区国产专区| 欧美激情第1页| 欧美成人免费全部| 91亚洲精品久久久| 国产精品丝袜视频| 欧美激情一级二级| 日韩成人在线观看| 亚洲人成欧美中文字幕| 2019中文字幕在线免费观看| 日韩视频一区在线| 欧美日韩国产精品一区二区三区四区| 久久夜色精品亚洲噜噜国产mv| 国产日韩在线视频| 91高清视频免费| 一本一本久久a久久精品牛牛影视| 美日韩精品视频免费看| 成人午夜一级二级三级| 国产精品亚洲第一区| 国产成人91久久精品| 亚洲香蕉成视频在线观看| 色综合久久久久久中文网| 国产日韩欧美中文| 国产精品视频地址| 色综合伊人色综合网站| 亚洲精品98久久久久久中文字幕| 国产精品扒开腿做爽爽爽男男| 国产精品美女久久久久久免费| 精品人伦一区二区三区蜜桃网站| 日韩欧美精品在线观看| 91精品国产网站| 色噜噜狠狠色综合网图区| 国产精品久久久久久影视| 精品人伦一区二区三区蜜桃网站| 日本一区二区不卡| 中文字幕亚洲天堂| 97人人爽人人喊人人模波多| 91人成网站www| 精品中文字幕乱| 午夜精品99久久免费| 欧美午夜久久久| 成人av色在线观看| 欧美多人爱爱视频网站| 日韩免费在线观看视频| zzjj国产精品一区二区| 国产欧美精品久久久| www.亚洲一区| 国产日韩精品视频| 一区二区三区视频免费在线观看| 精品国产一区二区三区久久狼黑人| 亚洲国产成人在线视频| 亚洲一区二区在线播放| 91亚洲精品在线观看| 国产精品久久久久久亚洲调教| 色婷婷久久av| 日韩av电影国产| 国产成人精品在线播放| 精品美女久久久久久免费| 夜夜狂射影院欧美极品| 亚洲韩国青草视频| 亚洲国产一区二区三区在线观看| 97不卡在线视频| 亚洲欧美一区二区精品久久久| 久久中文精品视频| 久久久久久久激情视频| 国产精品福利无圣光在线一区| 国产成人精品久久亚洲高清不卡| 国产人妖伪娘一区91| 97国产精品视频| 亚洲少妇激情视频| 97精品一区二区视频在线观看| 5252色成人免费视频| 国产精品69精品一区二区三区| 成人精品视频99在线观看免费| 欧美精品福利在线| 日本精品免费一区二区三区| 精品国产欧美一区二区三区成人| 91综合免费在线| 欧美性在线观看| 亚洲日韩欧美视频一区| 亚洲女人天堂av| 国产精品久久在线观看| 91在线观看免费观看| 国产日韩中文字幕| 亚洲人高潮女人毛茸茸| 亚洲黄色www| 正在播放欧美视频| 成人免费网视频| 在线观看欧美www| 国产视频久久久| 久久久久久久久久国产精品| 亚洲精品第一国产综合精品| 国产亚洲一区二区精品| 日韩在线观看你懂的| 国产精品免费久久久久久| 91豆花精品一区| 国产九九精品视频| 亚洲精品久久久久久久久久久久| 国产精品无码专区在线观看| 国产精品69久久| 国产精品久久久久久搜索| 欧美精品电影免费在线观看| 欧美日本中文字幕| 成人免费观看49www在线观看| 色先锋久久影院av| 2019国产精品自在线拍国产不卡| 亚洲爱爱爱爱爱| 黑人与娇小精品av专区| 美女视频久久黄| 日韩在线观看免费全| 国产精品女视频|