麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

多線程中的鎖系統(三)-WaitHandle、AutoResetEvent、ManualResetEvent

2019-11-17 02:39:05
字體:
來源:轉載
供稿:網友

多線程中的鎖系統(三)-WaitHandle、AutoResetEvent、ManualResetEvent

2015-01-10 08:45 by 蘑菇先生, ... 閱讀, ... 評論, 收藏, 編輯

本章主要介紹下基于內核模式構造的線程同步方式,事件,信號量。

閱讀目錄:

  1. 理論
  2. WaitHandle
  3. AutoResetEvent
  4. ManualResetEvent
  5. 總結

理論

Windows的線程同步方式可分為2種,用戶模式構造和內核模式構造。

內核模式構造:是由Windows系統本身使用,內核對象進行調度協助的。內核對象是系統地址空間中的一個內存塊,由系統創建維護。

  內核對象為內核所擁有,而不為進程所擁有,所以不同進程可以訪問同一個內核對象,如進程,線程,作業,事件,文件,信號量,互斥量等都是內核對象。

  而信號量,互斥體,事件是Windows專門用來幫助我們進行線程同步的內核對象。

  對于線程同步操作來說,內核對象只有2個狀態, 觸發(終止,true)、未觸發(非終止,false)。 未觸發不可調度,觸發可調度。

用戶模式構造:是由特殊CPU指令來協調線程,上節講的volatile實現就是一種,Interlocked也是。 也可稱為非阻塞線程同步。

WaitHandle

在windows編程中,通過API創建一個內核對象后會返回一個句柄,句柄則是每個進程句柄表的索引,而后可以拿到內核對象的指針、掩碼、標示等。

而WaitHandle抽象基類類作用是包裝了一個windows內核對象的句柄。我們來看下其中一個WaitOne的函數源碼(略精簡)。

        public virtual bool WaitOne(TimeSpan timeout)        {            return WaitOne(timeout, false);         }        [System.Security.SecuritySafeCritical]  // auto-generated        [Sup

WaitAll 和WaitAny 調用win32中,waitformultipleobjectsEx函數。

SignalAndWaitOne 調用win32中,signalandwait函數。

調用api帶ex都是設置超時的。 如果我們在c#中不傳,默認是-1 表示無限期等待。

其中SafeWaitHandle字段,包含了一個win32內核對象句柄。

理解了WaitHandle其他都好辦了,我們來看下它的派生類型。

WaitHandle   |——EventWaitHandle 事件構造。     |——AutoResetEvent     |——ManualResetEvent   |——Semaphore 信號量構造。   |——Mutex 互斥體構造。

其中Semaphore和mutex第一篇已經介紹過了,下面來看看其他的。

AutoResetEvent

使用示例如下,有簡單注釋。 關于描述,盡量貼近系統自身術語。

  static void Main(string[] args)        {            //AutoResetEvent example            //AutoResetEvent 通知正在等待的線程已發生的事件。            AutoResetEvent waitHandler = new AutoResetEvent(false);//false 即非終止,未觸發。            new Thread(() =>            {                waitHandler.WaitOne();  //阻塞當前線程,等待底層內核對象收到信號。                Console.WriteLine("接收到信號,開始處理。");            }).Start();            new Thread(() =>            {                Thread.Sleep(2000);                Console.WriteLine("發信號");                waitHandler.Set();    //向內核對象發送信號。設置事件對象為非終止狀態、false,解除阻塞。              }).Start();            //waitHandler.Close(); //釋放句柄資源。            //waitHandler.Reset();  //手動設置事件為非終止狀態、false,線程阻止。            Console.ReadLine();        }

WaitOne 阻塞線程,非自旋。

Set() 發出一個信號后,設置事件狀態為false。 這本應該是2步的操作,AutoResetEvent.set()函數,給2步一起自動做了,很方便。

ManualResetEvent

這個和上面基本一樣,從字面來說需要手動重置狀態,我們來看例子。

            ManualResetEvent manualWaitHandler = new ManualResetEvent(false);//false 即非終止,未觸發。            new Thread(() =>            {                manualWaitHandler.WaitOne();  //阻塞當前線程對象,等待信號。                Console.WriteLine("接收到信號,開始處理。");                manualWaitHandler.Reset();  //手動 設置事件對象狀態為非終止狀態,false。                manualWaitHandler.WaitOne();  //這里直接阻塞等待無效,因為事件對象還是true,必須手動調reset。                Console.WriteLine("第二次接收到信號,開始處理。");            }).Start();            new Thread(() =>            {                Thread.Sleep(2000);                Console.WriteLine("發信號");                manualWaitHandler.Set();    //向事件對象發送ok信號。。                Thread.Sleep(2000);                Console.WriteLine("第二次發信號");                manualWaitHandler.Set();            }).Start();            Console.ReadLine();

這2者區別很小,其實是系統Api的區分,不是net類庫實現的。

在Win32Native類中,我可以看到KERNEL32 api 有這么個參數isManualReset。

 [DllImport(KERNEL32, SetLastError=true, CharSet=CharSet.Auto, BestFitMapping=false)]        [ResourceExposure(ResourceScope.Machine)] // Machine or none based on the value of "name"        internal static extern SafeWaitHandle CreateEvent(SECURITY_ATTRIBUTES lpSecurityAttributes, bool isManualReset, bool initialState, String name);

總結

基于內核模式構造的同步步驟是: 托管代碼->用戶模式代碼->內核模式代碼。

用戶模式構造, 是利用CPU特殊指令,進行原子操作。

用戶模式代碼,如圖。 是指 托管代碼調用 win32代碼 這一層, 之后在調內核模式代碼。

參考CLR via c#及Windows核心編程第五版。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 87成人免费看片 | av中文字幕免费在线观看 | av电影手机在线看 | 一区二区三区日韩在线观看 | 欧美性受ⅹ╳╳╳黑人a性爽 | 亚洲网站免费观看 | 最新av网址在线观看 | 欧美精品久久久久久久久久 | 一级毛片免费大片 | 91福利免费观看 | 看毛片的网址 | 操操插插 | 中文字幕综合在线观看 | 精品一区二区三区免费毛片爱 | 久久精品中文字幕一区 | 国产精品久久久久久久久久久久久久久久 | 欧美黑大粗硬毛片视频 | 午夜在线观看视频网站 | 亚洲成人福利网站 | 国产精品久久久久久久久久尿 | 免费a级片在线观看 | 午夜神马福利视频 | 国产 日韩 一区 | 精品国产一区二区三区天美传媒 | 涩涩屋av | 久久成人福利 | 久久久久一区二区三区四区五区 | 天堂精品久久 | 久久精品23| 久久精品视频2 | 国产精品久久久久久久av | 美女被免费网站在线软件 | 欧美 日本 在线 | 久久精品一区二区三区国产主播 | a一级黄 | 国人精品视频在线观看 | 天堂在线资源av | 牛牛a级毛片在线播放 | 欧美一区二区三区中文字幕 | 黄色成人短视频 | 日韩精品中文字幕在线播放 |