多線程的同步機制

來源:互聯網
上載者:User

1、 Event

  用事件(Event)來同步線程是最具彈性的了。一個事件有兩種狀態:激髮狀態和未激髮狀態。也稱有訊號狀態和無訊號狀態。事件又分兩種類型:手動重設事件和自動重設事件。手動重設事件被設定為激髮狀態後,會喚醒所有等待的線程,而且一直保持為激髮狀態,直到程式重新把它設定為未激髮狀態。自動重設事件被設定為激髮狀態後,會喚醒“一個”等待中的線程,然後自動回復為未激髮狀態。所以用自動重設事件來同步兩個線程比較理想。MFC中對應的類為CEvent.。CEvent的建構函式預設建立一個自動重設的事件,而且處於未激髮狀態。共有三個函數來改變事件的狀態:SetEvent,ResetEvent和PulseEvent。用事件來同步線程是一種比較理想的做法,但在實際的使用過程中要注意的是,對自動重設事件調用SetEvent和PulseEvent有可能會引起死結,必須小心。

  2、 Critical Section

  使用臨界地區的第一個忠告就是不要長時間鎖住一份資源。這裡的長時間是相對的,視不同程式而定。對一些控制軟體來說,可能是數毫秒,但是對另外一些程式來說,可以長達數分鐘。但進入臨界區後必須儘快地離開,釋放資源。如果不釋放的話,會如何?答案是不會怎樣。如果是主線程(GUI線程)要進入一個沒有被釋放的臨界區,呵呵,程式就會掛了!臨界地區的一個缺點就是:Critical Section不是一個核心對象,無法獲知進入臨界區的線程是生是死,如果進入臨界區的線程掛了,沒有釋放臨界資源,系統無法獲知,而且沒有辦法釋放該臨界資源。這個缺點在互斥器(Mutex)中得到了彌補。Critical
Section在MFC中的相應實作類別是CcriticalSection。CcriticalSection::Lock()進入臨界區,CcriticalSection::UnLock()離開臨界區。

  3、 Mutex

  互斥器的功能和臨界地區很相似。區別是:Mutex所花費的時間比Critical Section多的多,但是Mutex是核心對象(Event、Semaphore也是),可以跨進程使用,而且等待一個被鎖住的Mutex可以設定TIMEOUT,不會像Critical Section那樣無法得知臨界地區的情況,而一直死等。MFC中的對應類為CMutex。Win32函數有:建立互斥體CreateMutex() ,開啟互斥體OpenMutex(),釋放互斥體ReleaseMutex()。Mutex的擁有權並非屬於那個產生它的線程,而是最後那個對此Mutex進行等待操作(WaitForSingleObject等等)並且尚未進行ReleaseMutex()操作的線程。線程擁有Mutex就好像進入Critical
Section一樣,一次只能有一個線程擁有該Mutex。如果一個擁有Mutex的線程在返回之前沒有調用ReleaseMutex(),那麼這個Mutex就被捨棄了,但是當其他線程等待(WaitForSingleObject等)這個Mutex時,仍能返回,並得到一個WAIT_ABANDONED_0傳回值。能夠知道一個Mutex被捨棄是Mutex特有的。

  4、 Semaphore

  訊號量是最具曆史的同步機制。訊號量是解決producer/consumer問題的關鍵要素。對應的MFC類是Csemaphore。Win32函數CreateSemaphore()用來產生訊號量。ReleaseSemaphore()用來解除鎖定。Semaphore的現值代表的意義是目前可用的資源數,如果Semaphore的現值為1,表示還有一個鎖定動作可以成功。如果現值為5,就表示還有五個鎖定動作可以成功。當調用Wait…等函數要求鎖定,如果Semaphore現值不為0,Wait…馬上返回,資源數減1。當調用ReleaseSemaphore()資源數加1,當時不會超過初始設定的資源總數。

     5、 Interlocked Variable

如果Interlocked…()函數被使用於所謂的spin-lock,那麼他們只是一種同步機制。所謂spin-lock是一種busy
loop,被預期在極短時間內執行,所以有最小的額外負擔(overhead)。系統核心偶爾會使用他們。除此之外,interlocked variables主要用於引用技術。他們:

·         允許對4位元組的數值有些基本的同步操作,不需動用到critical
section或mutex之類。

·         在SMP(Symmetric Multi-Processors)作業系統中亦可有效運作。


原文地址:http://hi.baidu.com/youngky2008/blog/item/c8eb13cb5a0e9a32f9dc61d6.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.