執行緒同步的幾種方式

2021-08-23 12:26:10 字數 2415 閱讀 7034

程序中線程同步的四種常用方式:有人說臨界區不算,先寫下臨界區的概念

1、 臨界區(ccriticalsection)

當多個執行緒訪問乙個獨占性共享資源時,可以使用臨界區物件。擁有臨界區的執行緒可以訪問被保護起來的資源或**段,其他執行緒若想訪問,則被掛起,直到擁有臨界區的執行緒放棄臨界區為止。具體應用方式:

1、 定義臨界區物件ccriticalsection g_criticalsection;

2、 在訪問共享資源(**或變數)之前,先獲得臨界區物件,g_criticalsection.lock();

3、 訪問共享資源後,則放棄臨界區物件,g_criticalsection.unlock();

2、 事件(cevent)

事件機制,則允許乙個執行緒在處理完乙個任務後,主動喚醒另外乙個執行緒執行任務。比如在某些網路應用程式中,乙個執行緒如a負責偵聽通訊埠,另外乙個執行緒b負責更新使用者資料,利用事件機制,則執行緒a可以通知執行緒b何時更新使用者資料。每個cevent物件可以有兩種狀態:有訊號狀態無訊號狀態。cevent類物件有兩種型別:人工事件自動事件

自動事件物件,在被至少乙個執行緒釋放後自動返回到無訊號狀態;

人工事件物件,獲得訊號後,釋放可利用執行緒,但直到呼叫成員函式reset()才將其設定為無訊號狀態。在建立cevent物件時,預設建立的是自動事件。

(1)

cevent(bool binitiallyown=false,

bool bmanualreset=false,

lpctstr lpszname=null,

lpsecurity_attributes lpsaattribute=null);

binitiallyown:指定事件物件初始化狀態,true為有訊號,false為無訊號;

bmanualreset:指定要建立的事件是屬於人工事件還是自動事件。true為人工事件,false為自動事件;

後兩個引數一般設為null,在此不作過多說明。

(2)bool cevent::setevent();

將cevent類物件的狀態設定為有訊號狀態。如果事件是人工事件,則cevent類物件保持為有訊號狀態,直到呼叫成員函式resetevent()將其重新設為無訊號狀態時為止。如果為自動事件,則在setevent()後將事件設定為有訊號狀態,由系統自動重置為無訊號狀態。

(3)bool cevent::resetevent();

將事件的狀態設定為無訊號狀態,並保持該狀態直至setevent()被呼叫為止。由於自動事件是由系統自動重置,故自動事件不需要呼叫該函式。

一般通過呼叫waitforsingleobject()函式來監視事件狀態。

3、 互斥量(cmutex)

互斥物件和臨界區物件非常相似,只是其允許在程序間使用,而臨界區只限制與同一程序的各個執行緒之間使用,

但是更節省資源,更有效率。

4、 訊號量(csemphore)

當需要乙個計數器來限制可以使用某共享資源的執行緒數目時,可以使用「訊號量」物件。csemaphore類物件儲存了對當前訪問某乙個指定資源的執行緒的計數值,該計數值是當前還可以使用該資源的執行緒數目。如果這個計數達到了零,則所有對這個csemaphore類物件所控制的資源的訪問嘗試都被放入到乙個佇列中等待,直到超時或計數值不為零為止。

csemaphore 類的建構函式原型及引數說明如下:

csemaphore(

long linitialcount = 1,

long lmaxcount = 1,

lpctstr pstrname = null,

lpsecurity_attributes lpsaattributes = null

);

linitialcount:訊號量物件的初始計數值,即可訪問執行緒數目的初始值;

lmaxcount:訊號量物件計數值的最大值,該引數決定了同一時刻可訪問由訊號量保護的資源的執行緒最大數目;

後兩個引數在同一程序中使用一般為null,不作過多討論;

一般是將當前可用資源計數設定為最大資源計數,每增加乙個執行緒對共享資源的訪問,當前可用資源計數就減1,只要當前可用資源計數大於0,就可以發出訊號量訊號。如果為0,則放入乙個佇列中等待。執行緒在處理完共享資源後,應在離開的同時通過releasesemaphore()函式將當前可用資源數加1。

bool releasesemaphore(  handle hsemaphore,       // hsemaphore:訊號量控制代碼 

long lreleasecount, // lreleasecount:訊號量計數值

lplong lppreviouscount // 引數一般為null);

執行緒同步的幾種方式

程序中線程同步的四種常用方式 一 臨界區 ccriticalsection 當多個執行緒訪問乙個獨占性共享資源時,可以使用臨界區物件。擁有臨界區的執行緒可以訪問被保護起來的資源或 段,其他執行緒若想訪問,則被掛起,直到擁有臨界區的執行緒放棄臨界區為止。具體應用方式 1 定義臨界區物件ccritica...

執行緒同步的幾種方式

程序中線程同步的四種常用方式 1 臨界區 ccriticalsection 當多個執行緒訪問乙個獨占性共享資源時,可以使用臨界區物件。擁有臨界區的執行緒可以訪問被保護起來的資源或 段,其他執行緒若想訪問,則被掛起,直到擁有臨界區的執行緒放棄臨界區為止。具體應用方式 1 定義臨界區物件ccritica...

執行緒同步的幾種方式

程序中線程同步的四種常用方式 1 臨界區 ccriticalsection 當多個執行緒訪問乙個獨占性共享資源時,可以使用臨界區物件。擁有臨界區的執行緒可以訪問被保護起來的資源或 段,其他執行緒若想訪問,則被掛起,直到擁有臨界區的執行緒放棄臨界區為止。具體應用方式 1 定義臨界區物件ccritica...