// 临界区.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<windows.h>
#include<iostream>
using namespace std;
DWORD g_cnt1;
DWORD g_cnt2;
BOOL g_bContinue = TRUE;
CRITICAL_SECTION cs;
DWORD WINAPI ThreadProc(__in LPVOID lpParameter)
{
::EnterCriticalSection(&cs);
while (g_bContinue)
{
g_cnt1++;
g_cnt2++;
printf("g_cnt1=%d\n", g_cnt1);
printf("g_cnt2=%d\n", g_cnt2);
}
::LeaveCriticalSection(&cs);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread[2];
g_cnt1 = g_cnt2 = 0;
::InitializeCriticalSection(&cs);
hThread[0] = ::CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
hThread[1] = ::CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
Sleep(100);
g_bContinue = FALSE;
::WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
printf("g_cnt1=%d\n", g_cnt1);
printf("g_cnt2=%d\n", g_cnt2);
::DeleteCriticalSection(&cs);
::CloseHandle(hThread[0]);
::CloseHandle(hThread[1]);
getchar();
return 0;
}
/*函数原型:DWORD WaitForMultipleObjects(
DWORDnCount, // number of handles in array
CONST HANDLE*lpHandles, // object-handle array
BOOLbWaitAll, // wait option
DWORDdwMilliseconds// time-out interval
);WaitForMultipleObjects函数用于等待多个内核对象,
前两个参数分别为要等待的内核对象的个数和句柄数组指针。
如果将第三个参数bWaitAll的值设为TRUE,等待的内核对象全部变成受信状态以后此函数才返回。
否则,bWaitAll为0的话,只要等待的内核对象中有一个变成了受信状态,
WaitForMultipleObjects就返回,返回值指明了是哪一个内核对象变成了受信状态*/