#include <iostream>
#include <windows.h>
using namespace std;
CRITICAL_SECTION cs;
HANDLE handle[10];
int threadNum = 10;
static int num = 0;
unsigned long WINAPI func(LPVOID p);
HANDLE h;
int main() {
h = CreateSemaphore(0, 0, 1, 0);
InitializeCriticalSection(&cs);
for (int i = 0; i < threadNum; ++i)
{
handle[i] = CreateThread(NULL, 0, func, &i, 0, 0);
WaitForSingleObject(h, INFINITE);
}
WaitForMultipleObjects(threadNum, handle, 1, INFINITE);
//销毁信号量和关键段
DeleteCriticalSection(&cs);
for (int i = 0; i < threadNum; ++i)
CloseHandle(handle[i]);
CloseHandle(h);
}
unsigned long WINAPI func(LPVOID p) {
int threadid = *(int *)p;
ReleaseSemaphore(h, 1, 0);
Sleep(50);
EnterCriticalSection(&cs);
cout << "thread" << threadid << " : " << GetCurrentThreadId() << "num is " << num << endl;
num++;
LeaveCriticalSection(&cs);
return 0;
}