多線程總結之旅(7):線程同步之互斥量

   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();
        }
    }

 

 下一篇咱們將介紹信號量。。。。。。。。。。。。。。。。。

相關文章
相關標籤/搜索