1 #include <stdio.h>
2 #include <process.h>
3 #include <windows.h>
4
5 //线程个数
6 const int THREAD_NUM = 3;
7
8 //循环次数
9 const int LOOP = 10;
10
11 //互斥事件
12 HANDLE g_hThreadEvent[THREAD_NUM];//子线程同步事件
13 HANDLE g_Semaphore; //主线程与子线程同步
14 //volatile int g_Count = 0;
15 int g_Count = 0;
16
17 unsigned int __stdcall ThreadFunction(void *pPM)
18 {
19 int num = *(int*)pPM;
20 ReleaseSemaphore(g_Semaphore, 1, NULL); //信号量++
21
22 for (int i = 0; i < LOOP; i++)
23 {
24 WaitForSingleObject(g_hThreadEvent[num], INFINITE);
25 //InterlockedIncrement((LPLONG)&g_Count);
26 g_Count++;
27
28 printf("第%d次 线程ID:%3d,线程打印:%c\n ", g_Count, GetCurrentThreadId(), num + 'A');
29
30 SetEvent(g_hThreadEvent[(num + 1) % THREAD_NUM]);
31 }
32
33 return 0;
34 }
35
36
37 int main(void)
38 {
39 int i = 0;
40 HANDLE hThreadHandle[THREAD_NUM];
41 g_Semaphore = CreateSemaphore(NULL, 0, 1, NULL); //当前0个资源,最大允许1个同时访
42
43 for (i = 0; i < THREAD_NUM; i++)
44 {
45 g_hThreadEvent[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
46 }
47
48 for (i = 0; i < THREAD_NUM; i++)
49 {
50 hThreadHandle[i] = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunction, &i, 0, nullptr);
51 WaitForSingleObject(g_Semaphore, INFINITE);
52 }
53
54 SetEvent(g_hThreadEvent[0]);
55
56 WaitForMultipleObjects(THREAD_NUM, hThreadHandle, true, INFINITE);
57
58 for (i = 0; i < THREAD_NUM; i++)
59 {
60 CloseHandle(hThreadHandle[i]);
61 CloseHandle(g_hThreadEvent[i]);
62 }
63
64 CloseHandle(g_Semaphore);
65
66 return 0;
67 }