win32多執行緒程式設計筆記(第三章)

2021-06-18 07:42:11 字數 1390 閱讀 7092

一、複習第二章

在第二章中,講到了兩種等待執行緒的技術:

1)使用sleep()函式——問題是你不可能事先知道什麼事情要等待多久

2)使用busy loop,通過不斷地呼叫getexitcodethread()這個函式來判斷乙個執行緒是否還在執行——問題是使用這個方法,必須持續不斷的呼叫getexitcodethread(),直到其結果不再是still_active,這方法不好,很浪費cpu時間,稱為忙等待(busy waits)。

for ( ; ; )

那麼我們該怎麼辦?

二、另外一種有效的方法 使用

waitforsingleobject(hhandle,dwmilliseconds);

功能:某一線程中呼叫這個函式,此執行緒會被掛起,

1)dwmilliseconds毫秒內,如果此執行緒所等待的物件(hhandle所指執行緒)變成有訊號狀態(被激發,即hhandle執行緒結束),則該函式立即返回執行函式下面的**;

2)超過dwmilliseconds毫秒,hhandle所指的物件還沒有變成有訊號狀態,照樣返回。

三、等待多個物件

先看乙個實在的例子:

//參考書上例子

//程式的目的:只用個執行緒 ,完成件事

int main()

//構造執行緒

hthrds[slot] = createthread(null,0,threadfunc,null,0,null);

if (++slot>2)

slot=0;

}for ( slot=0; slot<3; slot++)

}

上面的這段程式有乙個問題,就是效率不是很高;

理想的狀況是,一旦有乙個執行緒結束,就立刻產生乙個執行緒補上。仔細讀上面的程式,你會發現它無法實現理想的狀況;因為它假設執行緒結束的次序會和它們被產生的次序相同。比如,當依序產生了

1,2,3執行緒以後,一定是按1,2,3的次序結束。

其實不然,

也許2比1更早結束。在這時,上面的程式並不會立刻產生乙個執行緒填補2,而是非要等1結束了,才產生執行緒。那麼能夠實現

理想的狀況嗎?答案是可以,請用

waitformultipleobjects()

函式, 這個函式的用法基本上與

waitforsingleobject()

差不多,在這裡我就不舉例說明了。

總結:

等待執行緒結束:waitforsingleobject

等待多個執行緒結束:waitformultipleobjects

等待多個執行緒結束或訊息到達:msgwaitformultipleobjects

WIN32多執行緒程式設計學習筆記(第三章)

通過在上一章的學習,我學會使用getexitcodethread 這個函式來判斷乙個執行緒是否還在執行。通過這個函式,我就可以對付 某個執行緒必須在某個執行緒結束後才能執行 的情況。複習一下 程式片段 for 使用這個方法,必須持續不斷的呼叫getexitcodethread 直到其結果不再是sti...

WIN32多執行緒程式設計學習筆記(第三章)

win32多執行緒程式設計學習筆記 第三章 收藏 win32多執行緒程式設計學習筆記 第三章 通過在上一章的學習,我學會使用getexitcodethread 這個函式來判斷乙個執行緒是否還在執行。通過這個函式,我就可以對付 某個執行緒必須在某個執行緒結束後才能執行 的情況。複習一下 程式片段 fo...

win32多執行緒程式設計

使用3個執行緒完成6個任務,工作的執行是靠呼叫sleep 來模擬,時間長度是隨機給予的,只要乙個執行緒結束,就會有另乙個執行緒被產生。taskques.cpp 定義控制台應用程式的入口點。include stdafx.h include include include define win32 le...