windows多執行緒程式設計2

2021-06-17 22:25:29 字數 2703 閱讀 3407

強調:

win32說明檔案一再強調執行緒分為gui執行緒和worker執行緒兩種。gui執行緒

負責建造視窗以及處理主訊息迴圈。worker 負責執行純粹運算工作,如重新

計算或重新編頁等等,它們會導致主線程的訊息佇列失去反應。一般而言,gui

執行緒絕不會去做那些不能夠馬上完成的工作。

gui執行緒的定義是:擁有訊息佇列的執行緒。任何乙個特定視窗的訊息總是

被產生這一視窗的執行緒抓到並處理。所有對此視窗的改變也都應該由該執行緒完

成。如果 worker 執行緒也產生了乙個視窗,那麼就會有乙個訊息佇列隨之被產

生出來並且附著到此執行緒身上,於是worker執行緒搖身一變成了gui執行緒。這

裡的意思是,worker 執行緒不能夠產生視窗、對話方塊、訊息框,或任何其他與

ui有關的東西。

所謂表面積,意指必須被執行緒共享的資料結構。要知道,程式愈是密切地與執行緒

有關係,愈是容易產生錯誤並發生race condition。

核心物件激發狀態的意義

:「激發」 signaled 對於不同的核心物件有不同的意義。

thread 執行緒,當執行緒結束時,執行緒物件即被激發。當執行緒還在進行時,則物件處於未激發狀態。

process 程序,當程序結束時,程序物件即被激發。當程序還在進行時,則物件處於未激發狀態。

主要函式:waitforsingleobject

函式原型:

dword waitforsingleobject(

handle hhandle,

dword  dwmilliseconds

引數 :

hhandle 等待物件的 handle (代表乙個核心物件)。在本

例中,此為執行緒 handle 。

dwmilliseconds  等待的最長時間。時間終了,即使handle  尚未成

為激發狀態,此函式還是要返回。此值可以是 0

(代表立刻返回),也可以是 infinite  代表無

窮等待。

返回值:

如果函式失敗,則傳回wait_failed。這時候你可呼叫getlasterror()  取

1.等待的目標(核心物件)變成激發狀態。這種情況下返回值將為

wait_object_0。

2.核心物件變成激發狀態之前,等待時間終了。這種情況下返回值將為

wait_timeout。

3.如果乙個擁有 mu tex(互斥器)的執行緒結束前沒有釋放 mu tex,則傳

回 wait_ abandoned 。

如上所述,可以推出,函式等待至以下兩種情況之一發生

1:執行緒 #2  結束

2: dwmilliseconds  時間終了。該值系從函式呼叫後開始計算。

for (;;)

int rc;

rc = getexitcodethread(hthrd, &exitcode);

if (!rc && exitcode != still_active )

break;

這個 busy  loop  現在可以被下面這行**取代了:

waitforsingleobject( hthrd, infinite );

一次只能等待乙個thread。

如果需要一次等待多個thread,則需要下面這個函式:

主要函式:waitformultipleobjects

函式原型:

dword waitformultipleobjects(

dword ncount,                     //handles  陣列的元素個數

const handle *lphandles, // handles 所組成的陣列

bool bwaitall,              // true:所有執行緒激發時才返回;flase:任一線程啟用時返回。

引數:ncount  表示 lph andles  所指之handles  陣列的元素個

數。最大容量是 maximum_wait_objects 。

lphandles 指向乙個由物件 handles  所組成的陣列。這些

handles 不需要為相同的型別。

bwaitall  如果此為 true ,表示所有的 handles  都必須激

發,此函式才得以返回。否則此函式將在任何乙個

handle 激發時就返回。

dwmilliseconds  當該時間長度終了時,即使沒有任何handles  激

發,此函式也會返回。此值可為 0 ,以便測試。亦

可指定為 infinite ,表示無窮等待。

返回值:waitformultipleobjects()  的返回值有些複雜。

如果因時間終了而返回,則返回值是 wait_timeout ,類似 waitforsingleobject()。

如果bwaitall  是 true ,那麼返回值將是wait_object_0 。

如果bwaitall  是 false ,那麼將返回值減去wait_object_0,就

表示陣列中的哪乙個 handle  被激發了。

*如果你等待的物件中有任何 mu texes,那麼返回值可能從

wait_abandoned_0 到  wait_abandoned_0 + ncount - 1 。

如果函式失敗,它會傳回wait_failed 。這時候你可以使用

getlasterror() 找出失敗的原因。

Windows多執行緒程式設計

一 問題的提出 編寫乙個耗時的單執行緒程式 新建乙個基於對話方塊的應用程式singlethread,在主對話方塊idd singlethread dialog新增乙個按鈕,id為idc sleep six second,標題為 延時6秒 新增按鈕的響應函式,如下 void csinglethread...

windows多執行緒程式設計

程序 乙個執行的程式,記憶體,cpu時間等都歸程序所有.執行緒 cpu排程的最小單位,乙個程序內的多個執行緒共享4g記憶體.程式的乙個執行路徑 1.最基礎的使用方法.createthread,exitthread,closehand include include createthread,exit...

Windows多執行緒程式設計

函式原型 handlewinapi createthread lpsecurity attributes lpthreadattributes,size t dwstacksize,lpthread start routine lpstartaddress,lpvoid lpparameter,dw...