// 信号量演示
#include<iostream>
#include <windows.h>
using namespace std;
HANDLE g_ThreadSema; //创建内核对象,用来初始化信号量
DWORD WINAPI Func(LPVOID);
DWORD WINAPI Func1(LPVOID p);
int main()
{
int i = 0;
DWORD threadID[20] = { 0 };
g_ThreadSema = CreateSemaphore(NULL, 0, 10, NULL); //创建匿名信号量,初始资源为零,最大并发数为1,
CreateThread(NULL, 0, Func1, NULL, 0, &threadID[1]);
Sleep(500);
CreateThread(NULL, 0, Func, NULL, 0, &threadID[0]);
Sleep(500);
while (1)
{
Sleep(1000);
}
CloseHandle(g_ThreadSema); //销毁信号量
return 0;
}
//生产者线程
DWORD WINAPI Func(LPVOID p)
{
while (1)
{
cout << "give the sem" << endl;
ReleaseSemaphore(g_ThreadSema, 3, NULL); //信号量资源数加3
Sleep(2000);
}
return 0;
}
//消费者线程
DWORD WINAPI Func1(LPVOID p)
{
while (1)
{
WaitForSingleObject(g_ThreadSema, -1);
cout << "get sem" << endl;
}
return 0;
}
打印如下:
也就是生产者线程每次释放信号量(计数增加3),消费者线程就可以3次获得信号量。