1. 程式人生 > >[.Net執行緒處理系列]專題五:執行緒同步——事件構造

[.Net執行緒處理系列]專題五:執行緒同步——事件構造

引言:

    其實這部分內容應該是屬於專題四,因為這篇也是講關於執行緒同步的,但是由於考慮到使用者的閱讀習慣問題,因為文章太長了,很多人不是很願意看包括我也是這樣的,同時也有和我說可以把程式碼弄成摺疊的,這樣就不會太長的,但是我覺得這樣也不怎麼便於閱讀,因為我看別人的部落格的時候,看到有程式碼是摺疊起來的時候很多時候不願意去點,並且點一下之後同樣拉長文章的,然後就看到右邊的滾動條變小了,本以為快看完了(意思快學到知識了),一看滾動條後發現還有好長的內容很看, 所以就會給人一種不舒服的感覺吧(如果有和我一樣的人的話,你肯定懂的是什麼感覺的)。所以我把執行緒同步放到兩篇文章裡面來說,其實放到兩篇文章裡面也有一定原因的, 前面講的執行緒同步主要是使用者模式的(CLR Via C# 一書中是這麼定義的,書中說到執行緒同步分兩種:一、使用者模式構造 二、核心模式構造,第一次看的時候不是很理解兩個名詞是什麼意思的,我一般理解東西是採用把東西拆分來理解,理解拆分的各個部分後再合起來理解內容的,現在我對著兩個的理解是——使用者模式構造:對於核心模式構造(指的的是構造操作系核心物件),我們使用類(.net Framework中的類,如 AutoResetEvent, Semaphore類)的方法來實現執行緒同步,其實內部是呼叫作業系統的核心物件來實現的執行緒同步,此時就會導致執行緒從託管程式碼到為核心程式碼,然而使用者模式構造,沒有呼叫作業系統核心物件,執行緒只是在使用者的託管程式碼上執行的),對於使用者模式構造和核心模式的構造只是我自己的理解的, 如果有更好的理解方式可以留言告訴下我, 這樣我們可以一起討論和學習了。

目錄

一、WaitHandle基類介紹

二、事件(Event)類實現執行緒同步

三、小結

一、WaitHandle基類介紹

System.Threading名稱空間中提供了一個WaitHandle 的抽象基類,此類就是包裝了一個Windows核心物件的控制代碼(控制代碼可以理解為標示了物件例項的一個數字,具體大家可以檢視資料深入理解下的,在這裡只是提出理解控制代碼也是很重要的),在.net Framework中提供了從WaitHandle類中派生的類(我正是用這些派生類在我們的程式碼中實現執行緒同步的)。它們的一個繼承關係為

WaitHandle

  EventWaitHandle

  AutoResetEvent

    ManualResetEvent

  Semaphore

  Mutex

當我們在使用 AutoResetEvent,ManualResetEvent,Semaphore,Mutex這些類的時候,用建構函式來例項化這些類的物件時,其內部都呼叫了Win32 CreateEvent或CreateEvent函式,或CreateSemaphore或者CreateMutex函式,這些函式呼叫返回的控制代碼值都儲存在WaitHandle基類定義的SafeWaitHandle欄位中。

二、事件(Event)類實現執行緒同步

2.1 AutoResetEvent (自動重置事件)

先講講AutoresetEvent類的建構函式,其定義為:

public AutoResetEvent(bool initialState);

建構函式中用一個bool 型別的初始狀態來設定AutoResetEvent物件的狀態,如果要將AutoResetEvent物件的初始狀態設定為終止,則傳入bool值為true,若要設定非終止,就傳入false。

WaitOne方法定義:

public virtual bool WaitOne(int millisecondsTimeout);該方法用來阻塞執行緒,當在指定的時間間隔還沒有收到一個訊號時,將返回false。

呼叫Set方法發訊號來釋放等待執行緒。在使用過程中WaitOne方法和Set方法都是成對出現的, 一個用於阻塞執行緒,等待訊號,一個用來釋放等待執行緒(就是說呼叫set方法來發送一個訊號,此時WaitOne接受到訊號,就釋放阻塞的執行緒,執行緒就可以繼續執行)

執行緒通過呼叫AutoResetEvent的WaitOne方法來等待訊號,如果AutoResetEvent物件為非終止狀態,則執行緒被阻止,等到執行緒呼叫Set方法來恢復執行緒執行。如果AutoResetEvent為終止狀態時,則執行緒不會被阻止,此時AutoResetEvent將立即釋放執行緒並返回為非終止狀態(指出有執行緒在使用資源的一種狀態)。

下面通過通過一個例子來演示下AutoResetEvent的使用:

  1. using System;  
  2. using System.Threading;  
  3. namespace KenelMode  
  4. {  
  5. class Program  
  6.     {  
  7. // 初始化自動重置事件,並把狀態設定為非終止狀態
  8. // 如果這裡把初始狀態設定為True時,
  9. // 當呼叫WaitOne方法時就不會阻塞執行緒,看到的輸出結果的時間就是一樣的了
  10. // 因為設定為True時,表示此時已經為終止狀態了。       
  11. publicstatic AutoResetEvent autoEvent = new AutoResetEvent(false);  
  12. staticvoid Main(string[] args)  
  13.         {  
  14.             Console.WriteLine("Main Thread Start run at: " +DateTime.Now.ToLongTimeString());  
  15.             Thread t = new Thread(TestMethod);  
  16.             t.Start();  
  17. // 阻塞主執行緒3秒後
  18. // 呼叫 Set方法釋放執行緒,使執行緒t可以執行
  19.             Thread.Sleep(3000);  
  20. // Set 方法就是把事件狀態設定為終止狀態。
  21.             autoEvent.Set();  
  22.             Console.Read();  
  23.         }  
  24. publicstaticvoid TestMethod()  
  25.         {  
  26.             autoEvent.WaitOne();  
  27. // 3秒後執行緒可以執行,所以此時顯示的時間應該和主執行緒顯示的時間相差3秒
  28.             Console.WriteLine("Method Restart run at: " + DateTime.Now.ToLongTimeString());  
  29.         }  
  30.     }  
  31. 相關推薦

    [.Net執行處理系列]專題執行同步——事件構造

    引言:     其實這部分內容應該是屬於專題四,因為這篇也是講關於執行緒同步的,但是由於考慮到使用者的閱讀習慣問題,因為文章太長了,很多人不是很願意看包括我也是這樣的,同時也有和我說可以把程式碼弄成摺疊的,這樣就不會太長的,但是我覺得這樣也不怎麼便於閱讀,因為我

    PowerDesigner系列執行sql指令碼方式建立資料模型

    在PowerDesigner中建立資料模型時,如果有相應的sql指令碼,則不必通過在物理模型中逐個插入相應的欄位方式建立物理模型。可以通過在PowerDesigner中執行sql語句來建立資料模型。 建

    併發系列)-----執行

    一 簡介執行緒這個話題,不管是在面試中還是在工作中會經常的遇見。而併發程式設計的目的就是為了在儘量不影響程式的執行效率的情況下保證資料的安全性和正確性。要想理解執行緒首先要明白一些概念性的東西。 程序:具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位. 執

    Python並行程式設計()執行同步之訊號量

    1、基本概念       訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是一個內部資料,用於標明當前的共享資源可以有多少併發讀取。       同樣在threading中,訊號量有acquire和release兩個函式。       - 每當執行緒想要讀取關聯

    執行併發執行安全之重入鎖

    重入鎖簡單介紹 之前介紹的synchronized關鍵字是一種最簡單的控制方法。下面說一說執行緒安全的另一種實現方式——–重入鎖 重入鎖使用java.util.concurrent.loks.ReentrantLock 類來實現 a. lock()

    [C# 網絡編程系列]專題UDP編程補充——UDP廣播程序的實現

    tca ssa 程序 als learn ans targe focus ase 上次因為時間的關系,所以把上一個專題遺留下的一個問題在本專題中和大家分享下,本專題主要介紹下如何實現UDP廣播的程序,下面就直接介紹實現過程和代碼以及運行的結果。 一、程序實現 UDP廣播程序

    [C# 網絡編程系列]專題UDP編程

    單播 using 功能 .get 掩碼 ati multi 內容 協議 紹了TCP編程的一些知識,UDP與TCP地位相當的另一個傳輸層協議,它也是當下流行的很多主流網絡應用(例如QQ、MSN和Skype等一些即時通信軟件傳輸層都是應用UDP協議的)底層的傳輸基礎,所以在本專

    深入理解Tomcat系列Context容器和Wrapper容器

    ssa stream servlet實例 可用 igel sse ould rip alt 前言 Context容器是一個Web項目的代表,主要管理Servlet實例,在Tomcat中Servlet實例是以Wrapper出現的。如今問題是怎樣才幹通過C

    開發指南專題JEECG微雲高速開發平臺代碼生成器

    之前 gem target utf8 文件夾 var lan rop 代碼 開發指南專題五:JEECG微雲高速開發平臺代碼生成器 1.1. Maven開發環境搭建 在搭建jeecg的maven開發環境之前,須要先配置好本機的ma

    數據庫面試系列mysql的存儲引擎

    當前 查看 efault 表鎖 blog 如果 show 事務 測試 mysql的默認存儲引擎是innoDB,是唯一一個支持事務和支持外鍵的存儲引擎, 可以通過:show variables like ‘default_storage_engine‘;查看當前數據庫到默認引

    Office 365 系列創建新用戶

    office365 創建賬號、分配許可 本章節跟大家分享怎麽去創建新用戶、分配許可以及修改用戶後綴和電子郵件地址。 登錄 Office 365 管理中心,點擊“用戶”--“活動用戶”--“+添加用戶”; 參照截圖,輸入對應的姓名、顯示名、登錄名、密碼等信息點擊“添加”

    mongo 3.4分片集群系列詳解平衡器

    大致 mongos 搭建 一次 相對 時間 表示 部分 man 這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗): 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo 3.4

    Hulu機器學習問題與解答系列 | 十多層感知機與布爾函數

    功能 目標 機器學習 分享圖片 研究 vue gic per 發展 今天沒有別的話,好好學習,多多轉發! 本期內容是 【多層感知機與布爾函數】 場景描述 神經網絡概念的誕生很大程度上受到了神經科學的啟發。生物學研究表明,大腦皮層的感知與計算功能是通過分多層實現的

    python接口自動化測試二十執行所有用例,並生成HTML測試報告

    odin 所有 郵件發送 QQ 二進制 multipart 分享圖片 html sse import requestsimport unittestclass TestQQ(unittest.TestCase): ‘‘‘測試QQ號接口‘‘‘

    多線程系列Balking 模式

    實現 vat 正常 bject ret .get 完全 .data 工具 一,什麽是Balking模式 如果現在不合適執行這個操作,或者沒必要執行這個操作,就停止處理,直接返回。在Balking模式中,如果守護條件不成立,就立即中斷處理。 二,例子: 定期將當前數據內容寫入

    android影象處理系列--給圖片新增邊框(中)

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    Kubernetes系列使用yaml檔案建立service向外暴露服務

    Service和Pod的理論介紹,方便繼續下去 Pod是有生命週期的,使用凡人皆有一死來描述pod很貼切,當一個工作節點(node)銷燬時,節點上執行的pods也會被銷燬, ReplicationController會動態地在其他節點上建立Pod來保持應用程式的執行,每一個Pod都有一個

    Spring Boot 系列Spring Boot 通過devtools進行熱部署

    前面已經分享過四篇學習文章: 1、Spring Boot 系統之一:Spring Boot 入門 2、Spring Boot 系統之二:Spring Boot 修改預設埠號和context path 3、Spring Boot 系統之三:Spring Boot 整合JdbcTemplat

    (四)多執行說學逗唱執行險惡,變數和執行安全不得不防

    (一)多執行緒說學逗唱:關於執行緒那不得不說的二三事 (二)多執行緒說學逗唱:新手村偶遇Thread類 (三)多執行緒說學逗唱:村口的老R頭是個掃地僧(Runnable) 出了新手村,以後的路可就不那麼好走了,到底現在也是個江湖人,都必須經歷點困難挫折,要不以後拿什

    碼農裝13寶典系列Ubuntu自定義字型縮放級別

    目前主流顯示器都有一個很高的解析度,而使用預設的解析度會使字型顯示過小,單純地調整解析度又容易讓字看起來發虛。 系統提供了一個字型縮放級別調整的功能。Windows初始化時就已經為使用者設定好了,而Ubuntu只有兩個選項:100%、200%,顯然不能滿足需求。 那怎麼辦? 這裡需要