一个线程创建后,并不是立马就执行,而是等时间片到来后才执行...
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()的区别详细解析