vc執行緒 訊號量 Event物件的使用

2021-06-23 02:00:05 字數 3833 閱讀 4177

注:實習期間的關於多執行緒方面的筆記,只是自己的理解,不一定權威正確。請讀者慎重,請諒解。一、

mfc多執行緒

可以通過afxbeginthread建立使用者介面執行緒或者工作者執行緒

工作者執行緒例子:

afxbeginthread函式說明:

afxbeginthread( afx_threadproc pfnthreadproc,   //啟動的函式

lpvoid pparam,   //pparam : 傳遞入執行緒的引數,注意它的型別為:lpvoid,所以我們可以傳遞乙個結構體入執行緒.

int npriority = thread_priority_normal, //0 設定優先順序為正常。

uint nstacksize = 0, //指定新建立的執行緒的棧的大小.如果為 0,新建立的執行緒具有和主線程一樣的大小的棧

dword dwcreateflags , //指定建立執行緒以後,執行緒有怎麼樣的標誌.可以指定兩個值create_suspended : 執行緒建立以後,會處於掛起狀態,直到呼叫:resumethread;0 : 建立執行緒後就開始執行.

lpsecurity_attributes lpsecurityattrs = null ); //如果為 null,那麼新建立的執行緒就具有和主線程一樣的安全性.

建立執行緒:

cwinthread *m_mythread;   //執行緒

m_mythread=afxbeginthread((afx_threadproc)threadproc, null,0,0,create_suspended,null);

//執行緒結束時不自動刪除,才能獲得lpexitcode,預設是true

m_mythread->m_bautodelete = false;

m_mythread->resumethread();

執行緒定義:

//執行緒函式

uint winapi threadproc(lpvoid lpparameter)

sleep(10);

。。。。。

}        

return0;}二、

獲取執行緒結束**

呼叫getexitcodethread()(並給予createthread所獲得的執行緒handle作為引數)而得知:

bool getexitcodethread(

handle hthread,

//某執行緒

lpdword lpexitcode

//執行緒退出** );

hthread:由createthread()傳回的執行緒handle

lpexitcode:

用於儲存執行緒的返回值

(exitcode)

返回值:該

函式執行成功則返回非0值,否則返回 0(false)

用法:定義  

dword

lpexitcode

=0;

執行緒函式定義如下:

dword winapi threadfunc(lpvoid n)

結束執行緒如下:

afxendthread(lpexitcode);  //關閉執行緒

for(;;)  

註解:if( lpexitcode== still_active )

//still_active表示執行緒在執行

trace

("thread1 is still running!");

if( lpexitcode

!= still_active )

//執行緒已經結束 或者

if( lpexitcode

== 100

)//100

為前面執行緒函式的返回值

return值

附:執行緒的handle用處:

執行緒的handle是指向「執行緒的核心物件」的,而不是指向執行緒本身.每個核心物件只是核心分配的乙個記憶體塊,並且只能由核心訪問。該記憶體塊是一種資料結構,它的成員負責維護物件的各種資訊(eg: 安全性描述,引用計數等)。

closehandle()

在createthread成功之後會返回乙個hthread的handle,且核心物件的計數加1,closehandle之後,引用計數減1,當變為0時,系統刪除核心物件。    

不執行closehandle() 帶來的後果:

結束執行緒函式

函式的宣告如下:

bool terminatethread( handle hthread, dword dwexitcode);

作用:

引數說明:

handle htread:被終止的執行緒的控制代碼,為cwinthread指標。

dword dwexitcode:退出碼。

返回值:

函式執行成功則返回非零值,執行失敗返回0。呼叫getlasterror獲得返回的值。

exitthread是比terminatethread()好的乙個結束執行緒的方法,當呼叫該函式時,當前執行緒的棧被釋放,然後執行緒終止,相對於terminatethread函式來說,這樣做能夠更好地完成附加在該執行緒上的dll的清除工作。

若要終止執行緒的執行,可以使用下面四種的方法:

執行緒函式退出迴圈來返回(最佳方法 )。最佳

通過呼叫exitthread 函式,執行緒將自行撤消(盡量不要使用這種方法 )。 次之

同乙個程序或另乙個程序中的執行緒呼叫terminatethread 函式(最好避免使用這種方法 )。 次之

該執行緒的主程序終止執行(避免使用 )。

在程序終止執行時撤消執行緒:

exitprocess和terminateprocess函式也可以用來終止執行緒的執行。差別在於這些執行緒將會使終止執行的程序中的所有執行緒全部終止執行。另外,由於整個程序已經被關閉,程序使用的所有資源肯定已被清除。這當然包括所有執行緒的堆疊。這兩個函式會導致程序中的剩餘執行緒被強制撤消,就像從每個剩餘的執行緒呼叫terminatethread 一樣。顯然,這意味著正確的應用程式清除沒有發生,即c++物件撤消函式沒有被呼叫,資料沒有轉至磁碟等等。 三、

waitforsingleobject 的用法

dword

waitforsingleobject (

handle hhandle,

dworddwmilliseconds                                

);引數hhandle 是乙個某事件的控制代碼,第二個引數 dwmilliseconds 是時間間隔。如果事件

a是有訊號狀態,則返回,返回wait_object_0 ,如果時間超過 dwmilliseconds 值,但事件還是無訊號狀態,則返回,返回 wait_timeout 。

用法://一旦事件物件處於有訊號狀態立即

break

if(::waitforsingleobject(g_end, 0) == wait_object_0)

用法二、

waitforsingleobject(g_event,infinite);

for(;;)

該執行緒中,只有g_event變為有訊號狀態時才執行下面的 for 迴圈,若g_event 是全域性變數,我們可以在別的執行緒中通過 g_event. setevent 控制這個執行緒。 四、

event物件

函式原型:

handle createevent(

lpsecurity_attributes lpeventattributes,//安全屬性,null為預設的安全屬性

bool bmanualreset,//復位方式,true為手動復位,false為自動復位

bool binitialstate,//初始狀態,true為初始為有訊號,false為無訊號

lpctstr lpname // 物件名稱

);

執行緒 訊號量

訊號量 訊號量本質上是乙個非負的整數計數器,它被用來控制對公共資源的訪問。當公共資源增加時,呼叫函式sem post 增加訊號量。只有當訊號量值大於 時,才能使用公共資源,使用後,函式sem wait 減少訊號量。函式sem trywait 和函式pthread mutex trylock 起同樣的...

執行緒與訊號量

訊號量的資料型別為結構sem t,它本質上是乙個長整型的數。函式sem init 用來初始化乙個訊號量。它的原型為 extern int sem init p sem t sem,int pshared,unsigned int value sem為指向訊號量結構的乙個指標 pshared不為 時此...

執行緒訊號量同步

thread sem.c include include include include define thread number 3 define repeat number 3 define delay time levels 10.0 sem t sem thread number void ...