MFC多執行緒同步方法

2021-06-21 02:22:52 字數 3032 閱讀 1400

mfc提供了多種同步物件,下面我們只介紹最常用的四種:

a、使用 ccriticalsection 類

當多個執行緒訪問乙個獨占性共享資源時,可以使用「臨界區」物件。任一時刻只有乙個執行緒可以擁有臨界區物件,擁有臨界區的執行緒可以訪問被保護起來的資源或**段,其他希望進入臨界區的執行緒將被掛起等待,直到擁有臨界區的執行緒放棄臨界區時為止,這樣就保證了不會在同一時刻出現多個執行緒訪問共享資源

b、使用 cevent 類

1、cevent(bool binitiallyown=false,

bool bmanualreset=false,

lpctstr lpszname=null,

lpsecurity_attributes lpsaattribute=null);

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

如果該函式執行成功,則返回非零值,否則返回零。

3、bool cevent::resetevent();
該函式將事件的狀態設定為無訊號狀態,並保持該狀態直至setevent()被呼叫時為止。由於自動事件是由系統自動重置,故自動事件不需要呼叫該函式。如果該函式執行成功,返回非零值,否則返回零。我們一般通過呼叫waitforsingleobject函式來監視事件狀態。 

c、使用cmutex 類

互斥物件與臨界區物件很像.互斥物件與臨界區物件的不同在於:互斥物件可以在程序間使用,而臨界區物件只能在同一程序的各執行緒間使用。當然,互斥物件也可以用於同一程序的各個執行緒間,但是在這種情況下,使用臨界區會更節省系統資源,更有效率。

d、使用csemaphore 類

當需要乙個計數器來限制可以使用某個執行緒的數目時,可以使用「訊號量」物件。csemaphore 類的物件儲存了對當前訪問某一指定資源的執行緒的計數值,該計數值是當前還可以使用該資源的執行緒的數目。如果這個計數達到了零,則所有對這個csemaphore 類物件所控制的資源的訪問嘗試都被放入到乙個佇列中等待,直到超時或計數值不為零時為止。乙個執行緒被釋放已訪問了被保護的資源時,計數值減1;乙個執行緒完成了對被控共享資源的訪問時,計數值增1。這個被csemaphore 類物件所控制的資源可以同時接受訪問的最大執行緒數在該物件的構建函式中指定。

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

csemaphore (long linitialcount=1,

long lmaxcount=1,

lpctstr pstrname=null,

lpsecurity_attributes lpsaattributes=null);

在用csemaphore 類的建構函式建立訊號量物件時要同時指出允許的最大資源計數和當前可用資源計數。一般是將當前可用資源計數設定為最大資源計數,每增加乙個執行緒對共享資源的訪問,當前可用資源計數就會減1,只要當前可用資源計數是大於0的,就可以發出訊號量訊號。但是當前可用計數減小到0時,則說明當前占用資源的執行緒數已經達到了所允許的最大數目,不能再允許其它執行緒的進入,此時的訊號量訊號將無法發出。執行緒在處理完共享資源後,應在離開的同時通過releasesemaphore()函式將當前可用資源數加1。

下面給出乙個簡單例項來說明 csemaphore 類的用法。

例程10 multithread10

建立乙個基於對話方塊的工程multithread10,在對話方塊idd_multithread10_dialog中加入乙個按鈕和三個編輯框控制項,按鈕的id為idc_start,標題為「同時寫『a』、『b』、『c』」;三個編輯框的id分別為idc_a、idc_b和idc_c,屬性都選中read-only;

在multithread10dlg.h檔案中宣告兩個執行緒函式:

static uint writea(lpvoid pparam);

static uint writeb(lpvoid pparam);

static uint writec(lpvoid pparam);

使用classwizard分別給idc_a、idc_b和idc_c新增cedit類變數m_ctrla、m_ctrlb和m_ctrlc;

在multithread10dlg.cpp檔案中新增如下內容: 為了檔案中能夠正確使用同步類,在檔案開頭新增:

#include "afxmt.h"
定義訊號量物件和乙個字元陣列,為了能夠在不同執行緒間使用,定義為全域性變數:
csemaphore semaphorewrite(2,2); //資源最多訪問執行緒2個,當前可訪問執行緒數2個 

char g_array[10];

新增三個執行緒函式:

uint writea(lpvoid pparam)

releasesemaphore(semaphorewrite.m_hobject,1,null);

return 0;

}uint writeb(lpvoid pparam)

releasesemaphore(semaphorewrite.m_hobject,1,null);

return 0;

}uint writec(lpvoid pparam)

releasesemaphore(semaphorewrite.m_hobject,1,null);

return 0;

}

這三個執行緒函式不再多說。在訊號量物件有訊號的狀態下,執行緒執行到waitforsingleobject語句處繼續執行,同時可用執行緒數減1;若執行緒執行到waitforsingleobject語句時訊號量物件無訊號,執行緒就在這裡等待,直到訊號量物件有訊號線程才往下執行。

雙擊按鈕idc_start,新增其響應函式:

void cmultithread10dlg::onstart() 

---from

MFC多執行緒同步方法

mfc提供了多種同步物件,下面我們只介紹最常用的四種 a 使用 ccriticalsection 類 當多個執行緒訪問乙個獨占性共享資源時,可以使用 臨界區 物件。任一時刻只有乙個執行緒可以擁有臨界區物件,擁有臨界區的執行緒可以訪問被保護起來的資源或 段,其他希望進入臨界區的執行緒將被掛起等待,直到...

MFC多執行緒 執行緒同步

執行緒間的同步 常用的同步物件 1 臨界區 critical section 2 互斥 mutex 3 訊號量 semaphore 4 事件 event mfc提供了幾種同步類和同步輔助類,包含在afxmt.h中 1 同步物件基類 csyncobject 抽象類,為win32中的同步物件提供通用效能...

MFC多執行緒與多執行緒的同步

dword winapi threadproc lpvoid lpparameter 注意這裡threadproc這個名字是可以按自己的要求修改的 handle winapi createthread lpsecurity attributes lpthreadattributes,安全性 size...