1 // CriticalSection.cpp : Defines the entry point for the console application.
2 //
3
4 #include "stdafx.h"
5 #include <windows.h>
6
7
8 // CriticalSection的InitializeCriticalSection(),DeleteCriticalSection()是不用本线程配对,EnterCriticalSection()与LeaveCriticalSection()也不用.
9 LONG g_i0{};
10 LONG g_i1{};
11 CRITICAL_SECTION cs{};
12 DWORD WINAPI ThreadProc1(LPVOID lpThreadParameter);
13 DWORD WINAPI ThreadProc2(LPVOID lpThreadParameter);
14
15 int main()
16 {
17 InitializeCriticalSection(&cs);
18
19 HANDLE hThread[2]{};
20 hThread[0] = CreateThread(0, 0, ThreadProc1, 0, 0, 0);
21 hThread[1] = CreateThread(0, 0, ThreadProc2, 0, 0, 0);
22
23 WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
24 CloseHandle(hThread[0]);
25 CloseHandle(hThread[1]);
26 DeleteCriticalSection(&cs);
27
28 printf("%d\n", g_i0);
29 printf("%d\n", g_i1);
30 system("pause");
31
32 return 0;
33 }
34
35
36 DWORD WINAPI ThreadProc1(LPVOID lpThreadParameter)
37 {
38 for (int i = 0; i < 1000000; i++)
39 {
40 EnterCriticalSection(&cs);
41 g_i0++;
42 g_i1++;
43 LeaveCriticalSection(&cs);
44 }
45
46
47
48 return 0;
49 }
50
51 DWORD WINAPI ThreadProc2(LPVOID lpThreadParameter)
52 {
53 for (int i = 0; i < 1000000; i++)
54 {
55 EnterCriticalSection(&cs);
56 g_i0++;
57 g_i1++;
58 LeaveCriticalSection(&cs);
59 }
60
61 return 0;
62 }