執行緒的建立

2021-07-31 21:25:53 字數 2668 閱讀 7338

建立執行緒的幾種方法

1)createthread(執行緒執行函式必須是全域性的)

使用方法:

//執行緒執行函式宣告  

dword winapi threadproc(lpvoid lpparam);

//建立執行緒

createthread(null,0,threadproc, &info[i],0,&dwthreadid[i]);  

解釋:

dword 就是 double word, 每個word為2個位元組的長度,dword 雙字即為4個位元組,每個位元組8位,共32位

winapi 視窗作業系統應用程式介面(windows api)

lpvoid,是乙個沒有型別的指標,乙個32位指標,指向乙個未指明的型別的值

執行函式即每個執行緒怎麼區分,所要做的事情,左後返回每個執行緒的id,因此是雙位元組的id,這裡是指向視窗的

createthread函式的引數,第乙個是安全屬性的設定及繼承,第二個是堆疊的大小,第三個是執行函式,

第四個是執行函式的 

引數,第五個是指向dword的指標,存放執行緒的id。

注意:傳遞給

執行緒執行函式的引數不能是區域性變數,而且必須是引數的位址。如:

int noffset = 10;

createthread(null,0,threadproc,noffset,0,&dwthreadid[i]);//錯誤

createthread(null,0,threadproc,&noffset,0,&dwthreadid[i]);//錯誤

int *poffset = newint(10);

createthread(null,0,threadproc,poffset,0,&dwthreadid[i]);//正確

(此處參考

2)afxbeginthread (執行緒執行函式必須是static成員函式)

使用者介面執行緒和工作者執行緒都是由afxbeginthread建立的。現在,考察該函式:mfc提供了兩個過載版的afxbeginthread,乙個用於使用者介面執行緒,另乙個用於工作者執行緒,分別有如下的原型和過程:

工作者執行緒的afxbeginthread

工作者執行緒的afxbeginthread的原型如下:

cwinthread* afxapi afxbeginthread(

afx_threadproc pfnthreadproc, //執行緒的入口函式,宣告如下: uint mythreadfunction( lpvoid pparam )

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

int npriority, //3、4、5分別指優先順序、堆疊大小、建立標識、安全屬性,含義同使用者

uint nstacksize,                            

dword dwcreateflags,

lpsecurity_attributes lpsecurityattrs)  

使用方法:

//宣告執行緒執行函式:static uint threadproduct(void *param);

//建立執行緒:m_pthreadconsumer = afxbeginthread(threadconsumer,this);//後面的引數都省略了

//把this傳過去,就可呼叫類成員. 執行緒函式就可使用和操作類的成員。注意執行緒函式是靜態類函式成員。

想要結束非ui執行緒,可以直接afxendthread

使用者介面執行緒的afxbeginthread

使用者介面執行緒的afxbeginthread的原型如下:

cwinthread* afxapi afxbeginthread(

cruntimeclass* pthreadclass,    //

從cwinthread派生的runtime_class類

int npriority, 

//定執行緒優先順序,如果為0,則與建立該執行緒的執行緒相同;

uint nstacksize, 

//執行緒的堆疊大小,如果為0,則與建立該執行緒的執行緒相同;

dword dwcreateflags,

//建立標識,create_suspended,則懸掛狀態建立,否則建立後

執行。lpsecurity_attributes lpsecurityattrs)  //

執行緒的安全屬性,nt下有用

使用方法:因為要處理訊息所以需要建立乙個訊息迴圈。從cwinthread派生出乙個類,再呼叫afxbeginthread產生乙個cwinthread物件。因為訊息迴圈的存在,要結束乙個ui執行緒必須在訊息佇列中放乙個wm_quit

上述解釋參考:

具體使用哪一種函式建立執行緒見

注意:無論是worker 或者ui執行緒,結束時都必須delete cwinthread物件

3 關於多執行緒計算的速度和cpu使用效率的解答

執行緒的建立

執行緒在thread物件建立時開始啟動,傳遞給執行緒的函式執行結束時,執行緒也結束。執行緒thread建構函式 template explicit thread fn fx,args ax thread thread other noexcept thr other.thr thread opera...

執行緒的建立

執行緒的建立 1 使用createthread函式建立執行緒 handle createthread lpsecurity attributes lpsa,dword cbstack,lpthread start routine lpstartaddr,lpvoid lpvthreadparam,d...

執行緒的建立

include int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg 1 引數及返回值 2 編譯注意事項 include include void printids...