多執行緒的同步機制

2021-06-01 22:06:43 字數 2047 閱讀 8057

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)作業系統中亦可有效運作。

執行緒同步機制

本週主要學習 執行緒同步機制 互斥量 讀寫鎖和條件變數 和簡單程式的實現,對執行緒同步有了進一步認識 內容如下 執行緒的基本概念,相關函式 互斥量 說明 處於標圓形框之上的線段表示相關的執行緒沒有擁有互斥量 處於圓形框中心線之上的線段表示相關的執行緒等待互斥量 處於圓形框中心線之下的線段表示相關的執...

執行緒同步機制

執行緒同步主要用於協調對臨界資源的訪問,臨界資源可以是硬體裝置 比如印表機 磁碟 檔案 記憶體 變數 陣列 佇列等 執行緒同步有4種機制 他們的主要區別在於 各同步機制詳細的功能說明如下 臨界區臨界區是一段獨佔對某些共享資源訪問的 在任意時刻只允許乙個執行緒對共享資源進行訪問。如果有多個執行緒試圖同...

執行緒同步機制

執行緒同步的四種機制 主要區別在於 適用範圍 臨界區在使用者模式下,不會發生使用者態到核心態的切換,只能用於同程序內線程間同步。其他會導致使用者態到核心態的切換,利用核心物件實現,可用於不同程序間的執行緒同步。效能 臨界區效能較好,一般只需要數個cpu週期。其他機制效能相對較差,一般需要數十個cpu...