#include <windows.h>
#include <iostream>
#include <process.h>
using namespace std;
int g_nCount1 = 0;
int g_nCount2 = 0;
CRITICAL_SECTION g_cs;//临界区
BOOL g_bContinue = TRUE;//线程结束标志
UINT WINAPI MyThread(LPVOID)
{
while(g_bContinue)
{
::EnterCriticalSection(&g_cs);//如果另一个线程在临界区的话,当前线程会一直等待下去
g_nCount1++;
g_nCount2++;
::LeaveCriticalSection(&g_cs);//把临界区还给Windows
}
return 0;
}
int main()
{
UINT uThreadId;
HANDLE h[2];
::InitializeCriticalSection(&g_cs);//临界区初始化
h[0] = (HANDLE)::_beginthreadex(
NULL,//线程安全性
0,//线程堆栈大小
MyThread,//线程函数的名称
NULL,//线程函数的参数
0,//立即启动
&uThreadId//内核给新生成的线程分配的线程ID
);
h[1] = (HANDLE)::_beginthreadex(
NULL,//线程安全性
0,//线程堆栈大小
MyThread,//线程函数的名称
NULL,//线程函数的参数
0,//立即启动
&uThreadId//内核给新生成的线程分配的线程ID
);
::Sleep(600);
g_bContinue = FALSE;
::WaitForMultipleObjects(
2,//要等待内核对象的数量
h,//句柄数组
TRUE,//是否要等待所有内核对象都成为受信状态
INFINITE//无限期等待下去
);
::CloseHandle(h[0]);
::CloseHandle(h[1]);
::DeleteCriticalSection(&g_cs);//删除林界区
cout<<g_nCount1<<" "<<g_nCount2<<endl;
char a;
cin >> a;
}