在使用涉及到crt儲存堆操作的crt庫函式中的多執行緒程式設計中,使用createthread來開始執行緒是很危險的,容易造成執行緒的意外終止,windows核心程式設計中推薦使用_beginthread、_beginthreadx和相對應的_endthread、_endthreadx函式
uintptr_t _beginthread( // native code
void( __cdecl *start_address )( void * ),
unsigned stack_size,
void *arglist
);
uintptr_t _beginthreadex( // native code
void *security,
unsigned stack_size,
unsigned ( __stdcall *start_address )( void * ),
void *arglist,
unsigned initflag,
unsigned *thrdaddr
);
此函式的使用方式和createthread相同,函式引數的型別相同,只是返回值需要強制轉換成handle
void _endthread( void ); void _endthreadex(unsigned retval);
_endthread,用於函式內部終止自己的執行緒執行,可以自動**執行緒資源,自動關閉控制代碼
_endthreadx,可傳入自定義的退出碼,不能自動**執行緒資源,不能關閉控制代碼(和exitthread的作用,效能類似)
上述說明只是建立新執行緒和終止執行緒是使用這種型別的,其他的操作方法(掛起,恢復掛起,等待)都還是一樣的
一下四種情況中要使用上述的函式,不要使用createthread類的函式
使用malloc和free,或是new和delete
使用stdio.h或io.h裡面宣告的任何函式(如printf)
使用浮點變數或浮點運算函式
呼叫任何乙個使用了靜態緩衝區的runtime函式,如asctime(),strtok(),rand()等
例程,執行緒函式傳入多個引數:
// 使用執行時庫開啟多執行緒.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include #include using namespace std;
void threadfun(void* param)
cout << "子執行緒執行結束" << endl;
}int main()
; handle hthread = (handle)_beginthread(threadfun, 0, p);
waitforsingleobject(hthread, infinite);
cout << "主線程執行結束" << endl;
return 0;
}
windows併發程式設計API(二)
dword winapi waitforsingleobject in handle hhandle,in dword dwmilliseconds 等待執行緒執行 返回引數 wait abandoned wait object 0 執行緒退出 wait timeout 等待時間到以後執行緒還未退出...
併發程式設計(四)
在併發佇列上jdk提供了兩套實現,乙個是以concurrentlinkedqueue為代表的高效能佇列,乙個是以blockingqueue介面為代表的阻塞佇列,無論哪種都繼承自queue。1 concurrentlinkedqueue 是乙個適用於高併發場景下的佇列,通過無鎖的方式,實現了高併發狀態...
併發程式設計 四
是指乙個執行緒a呼叫了物件o的wait 方法進入等待狀態,而另乙個執行緒b呼叫了物件o的notify 或者notifyall 方法,執行緒a收到通知後從物件o的wait 方法返回,進而執行後續操作。上述兩個執行緒通過物件o來完成互動,而物件上的wait 和notify notifyall 的關係就如...