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

首頁 > 編程 > C# > 正文

C#多線程編程中的鎖系統(三)

2020-01-24 02:00:48
字體:
來源:轉載
供稿:網友

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

目錄

一:理論
二:WaitHandle
三:AutoResetEvent
四:ManualResetEvent
五:總結

一:理論

我們曉得線程同步可分為,用戶模式構造和內核模式構造。

內核模式構造:是由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
        [SuppressMessage("Microsoft.Concurrency", "CA8001", Justification = "Reviewed for thread-safety.")]
        private bool WaitOne(long timeout, bool exitContext)
        {
            return InternalWaitOne(safeWaitHandle, timeout, hasThreadAffinity, exitContext);
        }
        [System.Security.SecurityCritical] 
        internal static bool InternalWaitOne(SafeHandle waitableSafeHandle, long millisecondsTimeout, bool hasThreadAffinity, bool exitContext)
        {
            Contract.EndContractBlock();
            int ret = WaitOneNative(waitableSafeHandle, (uint)millisecondsTimeout, hasThreadAffinity, exitContext);
           
            if (ret == WAIT_ABANDONED)
            {
                ThrowAbandonedMutexException();
            }
            return (ret != WaitTimeout);
        }
        //調用win32 waitforsingleobjectEx
        [System.Security.SecurityCritical]
        [ResourceExposure(ResourceScope.None)]
        [MethodImplAttribute(MethodImplOptions.InternalCall)]
        private static extern int WaitOneNative(SafeHandle waitableSafeHandle, uint millisecondsTimeout, bool hasThreadAffinity, bool exitContext);
 

 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代碼 這一層,   之后在調內核模式代碼。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美国产另类| 日本中文字幕久久看| 国产日韩欧美综合| 性色av一区二区三区在线观看| 国产精品久久久久久搜索| 伊人av综合网| 亚洲国产精品va在线| 国产亚洲精品va在线观看| 国产精品福利小视频| 欧美日韩国产成人在线观看| 欧美日韩免费区域视频在线观看| 久久精彩免费视频| 日韩免费高清在线观看| 亚洲欧美视频在线| 8050国产精品久久久久久| 亚洲美女自拍视频| 欧美激情一区二区三区在线视频观看| 成人乱色短篇合集| 最近的2019中文字幕免费一页| 久久久久五月天| 色狠狠久久aa北条麻妃| 久久久女人电视剧免费播放下载| 久久综合亚洲社区| 亚洲人成电影在线播放| 在线播放国产一区中文字幕剧情欧美| 国产偷亚洲偷欧美偷精品| 欧美在线日韩在线| 日本不卡高字幕在线2019| 综合网日日天干夜夜久久| 国产精品久久久久秋霞鲁丝| 日本一区二区三区在线播放| 国产亚洲精品久久久久久| 国产精品va在线播放| 国产精品免费福利| 亚洲午夜女主播在线直播| 成人精品久久av网站| 欧美精品激情在线观看| 亚洲已满18点击进入在线看片| 亚洲精品白浆高清久久久久久| 97精品久久久中文字幕免费| 欧美在线视频免费播放| 亚洲free性xxxx护士hd| 久久久欧美精品| 久久福利视频导航| 久久人人爽人人爽爽久久| 久久久噜噜噜久久| 久久久久久久国产精品| 日韩av网站导航| 91色在线观看| 国产一区二区三区精品久久久| 国产精品一二区| 亚洲aa中文字幕| 欧美在线一区二区三区四| 九九精品在线观看| 欧美精品少妇videofree| 日韩福利视频在线观看| 国产精品夜色7777狼人| 91国偷自产一区二区三区的观看方式| 51ⅴ精品国产91久久久久久| 91人成网站www| 少妇激情综合网| 亚洲精品久久久久久久久久久久| 日本91av在线播放| 欧美国产日韩二区| 亚洲最大成人在线| 2021久久精品国产99国产精品| 国产午夜精品理论片a级探花| 2019中文字幕全在线观看| 视频在线观看一区二区| 欧美性猛交xxxx富婆| 国产精品一二三视频| 国产精品久久久91| 国产日韩换脸av一区在线观看| 国产91精品在线播放| 中文字幕日韩在线观看| 欧美电影在线播放| 国产成人精品久久久| www国产精品视频| 欧美日本亚洲视频| 国产精品久久久久久av福利| 国产欧美日韩综合精品| 亚洲最大福利视频网| 日韩免费高清在线观看| 日韩av理论片| 亚洲国产福利在线| 精品久久香蕉国产线看观看gif| 欧美中文字幕在线播放| www国产亚洲精品久久网站| 美日韩精品免费视频| 亚洲欧洲第一视频| 精品国产91久久久| 亚洲va欧美va国产综合久久| 97热在线精品视频在线观看| 91色中文字幕| 91欧美激情另类亚洲| 欧美老妇交乱视频| 中文字幕亚洲欧美日韩2019| 在线观看国产精品91| 欧美一区二区三区精品电影| 97在线免费观看| 日韩免费观看高清| 黑人巨大精品欧美一区二区一视频| 亚洲成人xxx| 在线播放日韩精品| 国产精品黄页免费高清在线观看| 久久国内精品一国内精品| 91社区国产高清| 国产中文字幕亚洲| 97国产一区二区精品久久呦| 91国自产精品中文字幕亚洲| 亚洲欧美在线x视频| 国产精品青草久久久久福利99| 日本中文字幕不卡免费| 欧美色道久久88综合亚洲精品| 精品久久久av| 国产欧美在线看| 日韩欧美在线免费| 亚洲sss综合天堂久久| 亚洲精品欧美一区二区三区| 国产va免费精品高清在线| 国产亚洲a∨片在线观看| 亚洲国产精品视频在线观看| 日韩精品在线播放| 久久久久久久97| 亚洲新声在线观看| 91精品久久久久久久久久入口| 国产一区二区在线免费视频| 2020国产精品视频| 欧美又大粗又爽又黄大片视频| 国产精品久久久久久久久久久久久| 中文字幕亚洲色图| 欧美激情视频给我| 亚洲欧洲日产国产网站| 国产精品va在线播放我和闺蜜| 国模gogo一区二区大胆私拍| 中文字幕视频在线免费欧美日韩综合在线看| 国产69精品久久久久9| 麻豆乱码国产一区二区三区| 久久久国产成人精品| 久久久av电影| 91精品国产高清自在线看超| 日韩精品中文字幕在线| 欧洲亚洲在线视频| 国产精品国产福利国产秒拍| 中文字幕无线精品亚洲乱码一区| 疯狂做受xxxx欧美肥白少妇| 国产精品成人aaaaa网站| 国产精品欧美久久久| 欧美性猛交xxxx| 亚洲级视频在线观看免费1级| 亚洲精品视频网上网址在线观看| 日韩av免费一区| 韩国国内大量揄拍精品视频| 欧美性猛交xxxx免费看| 91成人精品网站| 日韩国产欧美精品一区二区三区| 美女视频黄免费的亚洲男人天堂| 51色欧美片视频在线观看| 亚洲精品第一页| 国产精品av在线播放| 亚洲91精品在线观看| 久久亚洲精品网站| 中文字幕日韩av电影| 欧美性videos高清精品|