1. 程式人生 > >_beginthreadex創建線程,立即執行?

_beginthreadex創建線程,立即執行?

code gin tro tab dex lpad mil and vertical

  一個線程創建後,並不是立馬就執行,而是等時間片到來後才執行...

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()的區別詳細解析

_beginthreadex創建線程,立即執行?