CriticalSection
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 }