#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; }