執行緒同步的幾種方式

2021-07-11 01:18:00 字數 2664 閱讀 6195

程序中線程同步的四種常用方式:

一、 臨界區(ccriticalsection)

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

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

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

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

二、 事件(cevent)

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

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

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

1、1

2

3

4

cevent(boolbinitiallyown=false,

boolbmanualreset=false,

lpctstrlpszname=null,

lpsecurity_attributes lpsaattribute=null);

2

、bool cevent

::setevent();

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

3

、bool cevent

::resetevent();

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

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

三、 互斥量(cmutex)

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

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

四、 訊號量(csemphore)

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

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

1

2

3

4

5

6

csemaphore(

longlinitialcount = 1,

longlmaxcount = 1,

lpctstrpstrname = null,

lpsecurity_attributes lpsaattributes = null

);

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

1

2

3

boolreleasesemaphore(handlehsemaphore,// hsemaphore:訊號量控制代碼

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

lplonglppreviouscount// 引數一般為null);

執行緒同步的幾種方式

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

執行緒同步的幾種方式

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

執行緒同步的幾種方式

1.同步 就是在發出乙個功能呼叫時,在沒有得到結果之前,該呼叫就不返回,同時其它執行緒也不能呼叫這個方法。2.執行緒同步 當有乙個執行緒在對記憶體進行操作時,其他執行緒都不可以對這個記憶體位址進行操作,直到該執行緒完成操作,其他執行緒才能對該記憶體位址進行操作,而其他執行緒處於等待狀態。在多執行緒程...