#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...