一個線程創建后,並不是立馬就執行,而是等時間片到來后才執行...
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
#include
<iostream> #include <Windows.h> #include <process.h> using namespace std; unsigned int _stdcall ThreadFun( void *pPM); long g_nNum; const int THREAD_NUM = 10 ; CRITICAL_SECTION g_csThreadCore; HANDLE hSemaphore; int main( void ) { g_nNum = 0 ; HANDLE handle[ 10 ]; int i = 0 ; //初始化臨界區 InitializeCriticalSection(&g_csThreadCore); //創建信號量 hSemaphore = CreateSemaphore( NULL , 0 , 1 , NULL ); while (i < THREAD_NUM) { handle[i] = (HANDLE)_beginthreadex( NULL , //第1個參數:安全屬性,NULL為默認安全屬性 0 , //第2個參數:指定線程堆棧的大小。如果為0,則線程堆棧大小和創建它的線程的相同。一般用0 ThreadFun, //第3個參數:指定線程函數的地址,也就是線程調用執行的函數地址(用函數名稱即可,函數名稱就表示地址) &i, //第4個參數:傳遞給線程的參數的指針,可以通過傳入對象的指針,在線程函數中再轉化為對應類的指針 0 , //第5個參數:線程初始狀態,0:立即運行;CREATE_SUSPEND:suspended(懸掛) NULL //第6個參數:用於記錄線程ID的地址 ); //直到hSemaphore有信號時,才往下繼續執行,而只有當創建的線程執行時,Semaphore才有信號。 WaitForSingleObject(hSemaphore, INFINITE); i++; } WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); DeleteCriticalSection(&g_csThreadCore); CloseHandle(hSemaphore); cin >> i; return 0 ; } unsigned int _stdcall ThreadFun( void *pPM) { int nThreadnum = *( int *)pPM; ReleaseSemaphore(hSemaphore, 1 , NULL ); EnterCriticalSection(&g_csThreadCore); g_nNum++; printf( "線程編號為%d 全局資源值為%d\n" , nThreadnum, g_nNum); LeaveCriticalSection(&g_csThreadCore); return 0 ; } |
參考:
http://blog.csdn.net/shuilan0066/article/details/7683382%20
error C2065: '_beginthreadex' : undeclared identifier 的解決辦法
CreateThread()與beginthread()的區別詳細解析