beginThreadex建立多執行緒解讀

2021-06-21 22:32:56 字數 3040 閱讀 5779

#include // for _beginthread()

需要的設定:projectàsetting-->c/c++-->user run-time library 選擇debug multithreaded 或者multithreaded。即使用: mt或mtd。

原始碼如下:

[cpp]view plain

copy

print?

#include 

#include // for stl string class   

#include // for handle   

#include // for _beginthread()   

using namespace std;  

class threadx  

static unsigned __stdcall threadstaticentrypoint(void * pthis)  

void threadentrypoint()  

}  printf( "%s thread terminating\n", threadname.c_str() );  

}  };  

int main()    

二、解釋

(1)如果你正在編寫c/c++**,決不應該呼叫createthread。相反,應該使用visualc++執行期庫函式_beginthreadex,退出也應該使用_endthreadex。如果不使用microsoft的visualc++編譯器,你的編譯器**商有它自己的createthread替代函式。不管這個替代函式是什麼,你都必須使用。

(2)因為_beginthreadex和_endthreadex是crt執行緒函式,所以必須注意編譯選項runtimelibaray的選擇,使用mt

或mtd。[multithreaded , debug multithreaded]。

(3)_beginthreadex函式的引數列表與createthread函式的引數列表是相同的,但是引數名和型別並不完全相同。這是因為microsoft的c/c++執行期庫的開發小組認為,c/c++

執行期函式不應該對

windows

資料型別有任何依賴。_beginthreadex函式也像createthread那樣,返回新建立的執行緒的控制代碼。

下面是關於

_beginthreadex

的一些要點:

1)每個執行緒均獲得由c/c++執行期庫的堆疊分配的自己的tiddata記憶體結構。(tiddata結構位於mtdll.h檔案中的visualc++源**中)。

2)傳遞給_beginthreadex的執行緒函式的位址儲存在tiddata記憶體塊中。傳遞給該函式的引數也儲存在該資料塊中。

3)_beginthreadex確實從內部呼叫createthread,因為這是作業系統了解如何建立新執行緒的唯一方法。

4)當呼叫createtthread時,它被告知通過呼叫_threadstartex而不是pfnstartaddr來啟動執行新執行緒。還有,傳遞給執行緒函式的引數是tiddata結構而不是pvparam的位址。

5)如果一切順利,就會像createthread那樣返回執行緒控制代碼。如果任何操作失敗了,便返回null。

(4)_endthreadex的一些要點:

c執行期庫的_getptd函式內部呼叫作業系統的tlsgetvalue函式,該函式負責檢索呼叫執行緒的tiddata記憶體塊的位址。

然後該資料塊被釋放,而作業系統的exitthread函式被呼叫,以便真正撤消該執行緒。當然,退出**要正確地設定和傳遞。

(5)雖然也提供了簡化版的的_beginthread和_endthread,但是可控制性太差,所以一般不使用。

(6)執行緒handle因為是核心物件,所以需要在最後closehandle。

handle getcurrentprocess();

handle getcurrentthread();

dword getcurrentprocessid();

dword getcurrentthreadid()。

dword setthreadidealprocessor(handle hthread,dworddwidealprocessor);

bool setthreadpriority(handle hthread,int npriority);

bool setpriorityclass(getcurrentprocess(),  idle_priority_class);

bool getthreadcontext(handle hthread,pcontextpcontext);

bool switchtothread();

(1)c++主線程的終止,同時也會終止所有主線程建立的子執行緒,不管子執行緒有沒有執行完畢。所以上面的**中如果不呼叫waitforsingleobject,則2個子執行緒t1和t2可能並沒有執行完畢或根本沒有執行。

(2)如果某執行緒掛起,然後有呼叫waitforsingleobject等待該執行緒,就會導致死鎖。所以上面的**如果不呼叫resumethread,則會死鎖。

為什麼要用

c執行時庫的

_beginthreadex

代替作業系統的

createthread

來建立執行緒?

**自自

2023年7

月msj

雜誌的《

win32 q&a

》欄目

你也許會說我一直用createthread來建立執行緒,一直都工作得好好的,為什麼要用_beginthreadex來代替createthread,下面讓我來告訴你為什麼。

回答乙個問題可以有兩種方式,一種是簡單的,一種是複雜的。

如果你不願意看下面的長篇大論,那我可以告訴你簡單的答案:_beginthreadex在內部呼叫了createthread,在呼叫之前_beginthreadex做了很多的工作,從而使得它比createthread更安全

詳解 beginthreadex 建立執行緒

目錄 需要的標頭檔案支援 include for beginthread 需要的設定 project setting c c user run time library選擇debug multithreaded或者multithreaded。即使用 mt或mtd。如下 include include...

beginthreadex建立多執行緒的用法

include include for stl string class include for handle include for beginthread using namespace std class threadx in c you must employ a free c functi...

建立主鍵 建立外來鍵 建立約束

建立主鍵 三種方法 建立學生表 第一種 create table student sno char 5 primary key,學號 可以直接指定主鍵 sname char 20 not null,姓名 s char 3 not null,性別 sage integer not null,年齡 sd...