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

2021-05-22 17:44:52 字數 1974 閱讀 8539

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

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

通過在上一章的學習,我學會使用getexitcodethread()這個函式來判斷乙個執行緒是否還在執行。通過這個函式,我就可以對付「某個執行緒必須在某個執行緒結束後才能執行」的情況。複習一下:

程式片段:

for  ( ; ; )

使用這個方法,必須持續不斷的呼叫getexitcodethread(),直到其結果不再是still_active。書上說這方法不好,很浪費cpu時間.,稱為忙等待(busy waits)。忙等待必須應有的重視,不然你會發現當包含忙等待的程式執行起來後,其它正在進行的程式的反應就很遲鈍了。因為cpu幾乎用了所有的可用時間去檢查執行緒是否結束。

那麼,我應該怎麼做呢?如何才更有效率呢?

另一種有效率的方法:

使用waitforsingleobject()這個函式來完美的解決問題。

完成上面程式片段同樣功能只需一句話:

waitforsingleobject ( hthrd, infinite );

若hthrd執行緒沒有結束時,呼叫這個函式的程式就會在函式呼叫點停下來,直到hthrd執行緒結束時(術語:hthrd被激發)才繼續向下執行。

不知道大家會不會有這樣疑問------這個函式不會只是把上面的程式片段包裝了一下吧?它真是很有效率嗎?如果它有效率,它是如何做到的呢?

可以告訴大家,waitforsingleobject()不是上述程式片段的簡單包裝,它真的很有效率(不信,按書上的方法,開啟效能管理器看看),至於它如何做到的,我也有興趣知道(知道告訴我),我只知道這個函式得到了作業系統級的某些底層排程函式的支援。

基本上本章的核心內容就是以上所述了。(至於waitforsingleobject()引數及返回值的說明,查書就行了,毋需多言)

具體的看乙個實在的例子,勝過在此長篇大論,下面請看:

//參考書上例子

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

int main()

//構造執行緒

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

if (++slot>2)

slot=0;

}// end for

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

// end for

}上面的這段程式有乙個問題,就是效率不是很高;理想的狀況是,一旦有乙個執行緒結束,就立刻產生乙個執行緒補上。仔細讀上面的程式,你會發現它無法實現理想的狀況;因為它假設執行緒結束的次序會和它們被產生的次序相同。比如,當依序產生了1,2,3執行緒以後,一定是按1,2,3的次序結束。其實不然,也許2比1更早結束。在這時,上面的程式並不會立刻產生乙個執行緒填補2,而是非要等1結束了,才產生執行緒。那麼能夠實現理想的狀況嗎?答案是可以,請用waitformultipleobjects() 函式, 這個函式的用法基本上與waitforsingleobject()差不多,在這裡我就不舉例說明了。

本章最後還提到了msgwaitformultipleobjects() , 這個函式特點是在訊息到達或執行緒結束時返回。

我想,只要用會了waitforsingleobject()這個函式, 那麼waitformultipleobjects()和msgwaitformultipleobjects()看一下也就會用了(書上舉了兩個小例子來說明,看一下花不了多少時間,不必我在這裡廢話了)。

這一章節的內容大概就是這麼多,總結一下:

* 等待執行緒結束                  [  waitforsingleobject()           ]

* 等待多個執行緒結束              [  waitformultipleobjects()                ]

* 等待多個執行緒結束或訊息到達    [  msgwaitformultipleobjects()         ]

附註:以上正文純屬加強記憶所做筆記,內容或有不詳,甚至錯誤,請閱者見諒,匆見怪!!!

《Win32多執行緒程式設計》學習筆記 (1)

最近開始看 win32 多執行緒程式設計 感覺受益匪淺,寫出來的目的有兩個 一是想看看自己理解的程度,能否總結出作者真正想表達的內容。2是與大家共享。好了,廢話就不說那麼多了!文章開始講述了作業系統的演化,作者從早期的 ms dos1.0 版本單任務系統到 2.x的可以允許常駐程式 tsr 但是 m...

win32多執行緒程式設計

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

Win32 多執行緒程式設計

程序和執行緒都是作業系統的概念 程序是應用程式的執行例項 每個程序是由私有的虛擬位址空間 資料和其它各種系統資源組成 程序在執行過程中建立的資源隨著程序的終止而被銷毀 所使用的系統資源在程序終止時被釋放或關閉 執行緒是程序內部的乙個執行單元 系統建立好程序後 實際上就啟動執行了該程序的主執行執行緒 ...