WaitHandle類簡介安全
上一篇咱們介紹了臨界區,還有互斥量、信號量以及事件沒有介紹。考慮到互斥量、信號量、事件的出身,因此在這裏作一個系統的介紹,讓你們對這三個實現線程同步的方法有個概念上的理解。spa
既然這樣就免不了介紹WaitHandle類。CSDN對它的定義以下:封裝等待對共享資源的獨佔訪問的操做系統特定的對象。來看下面的繼承層次結構圖。操作系統
看清楚了吧,沒錯,咱們接下來要講的事件(EventWaitHandle )、互斥量(Mutex)、信號量(Semaphore)都是繼承自System.Threading.WaitHandle。線程
再來一張詳細的類圖:code
WaitHandle類的做用:能夠調用它的方法,來等待若干個信號發生,便可以調節多個線程之間的同步。對象
它的方法不少,包括:blog
這些方法都會在子類中被重載。繼承
互斥量進程
接下來咱們開始介紹互斥量。。。。。。。。。。。。。。。。。 事件
互斥量跟臨界區很類似,只有擁有互斥對象的線程纔有訪問公共資源的權限,由於互斥對象只有一個,因此能保證公共資源不會同時被多個線程訪問。互斥不只能實現同一應用程序的公共資源安全共享,還能實現不一樣應用程序的公共資源安全共享。
適用範圍:能夠跨進程同步,還能夠用來保證程序只有一個實例運行(建立命名互斥量),也能夠用來作線程間的同步
2、互斥量metux
Metux中提供了WatiOne和ReleaseMutex來確保只有一個線程來訪問共享資源,是否是跟Monitor很相似。先介紹一下Menux的特色:
一、當給Mutex取名的時候可以實現進程同步,不取名實現線程同步,詳細細節參考MSDN:
二、Mutex封裝了win32的同步機制,而Monitor是由framework封裝,因此在線程同步角度來講,Monitor更加短小精悍,優於Mutex,要是實現進程
同步,Monitor也幹不了,因此Mutex是首選。其實使用Win32同步機制的還有:事件與信號量
示例一:線程間的同步:注意:沒有給Mutex起名字。
class Program { static void Main(string[] args) { for (int i = 0; i < 20; i++) { Thread t = new Thread(Run); t.Start(); } Console.Read(); } static int count = 0; static Mutex mutex = new Mutex(); static void Run() { Thread.Sleep(100); mutex.WaitOne(); Console.WriteLine("當前數字:{0}", ++count); mutex.ReleaseMutex(); } }
實例二:進程間的示例:給Mutex起了名字。
class Program { static void Main(string[] args) { Thread t = new Thread(Run); t.Start(); Console.Read(); } static Mutex mutex = new Mutex(false, "cnblogs"); static void Run() { mutex.WaitOne(); Console.WriteLine("當前時間:{0}我是線程:{1},我已經進去臨界區", DateTime.Now, Thread.CurrentThread.GetHashCode()); //10s Thread.Sleep(10000); Console.WriteLine("\n當前時間:{0}我是線程:{1},我準備退出臨界區", DateTime.Now, Thread.CurrentThread.GetHashCode()); mutex.ReleaseMutex(); } }
下一篇咱們將介紹信號量。。。。。。。。。。。。。。。。。