windows併發程式設計API(四)

2021-08-21 20:38:55 字數 1527 閱讀 5259

在使用涉及到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 的關係就如...