1、信号量
信号量设置一个资源访问计数。当该计数值大于0的时候,该信号量对象为有信号状态,当该计数值等于0的时候,该信号量对象为无信号状态。
2、信号量的使用
(1)创建信号量
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//安全属性
LONG lInitialCount,//初始信号量
LONG lMaximumCount,//最大信号量
LPCTSTR lpName //命名
);
(2)等待信号量
WaitForSingleObject
WaitForMultipleObjects
(3)释放信号量
BOOL ReleaseSemaphore(
HANDLE hSemaphore, //信号量句柄
LONG lReleaseCount,//释放信号的数量
LPLONG lpPreviousCount //释放前的数量
);
(4)关闭信号量
CloseHandle
扫描二维码关注公众号,回复:
3695687 查看本文章
(5)打开信号量
OpenSemaphore
3、代码示例
#include <iostream>
#include <Windows.h>
using namespace std;
static int number = 10;
HANDLE Sem;
DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
cout << "窗口1售票开始"<< endl;
while (1)
{
WaitForSingleObject(Sem, INFINITE);
if (number > 0)
{
cout << "窗口1售出第" << number << "张票" << endl;
--number;
Sleep(1000);
}
ReleaseSemaphore(Sem, 1, NULL);
}
return 0;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
cout << "窗口2售票开始" << endl;
while (1)
{
WaitForSingleObject(Sem, INFINITE);
if (number > 0)
{
cout << "窗口2售出第" << number << "张票" << endl;
--number;
Sleep(1000);
}
ReleaseSemaphore(Sem, 1, NULL);
}
return 0;
}
int main()
{
HANDLE HOne, HTwo;
Sem = CreateSemaphore(NULL, 1, 1, NULL);//初始值为1,最大值为1
HOne = CreateThread(NULL, 0, ThreadOne, NULL, 0, NULL);
HTwo = CreateThread(NULL, 0, ThreadTwo, NULL, 0, NULL);
CloseHandle(HOne);
CloseHandle(HTwo);
while (TRUE)
{
if (number == 0)
{
cout << "不好意思,票卖完了!" << endl;
CloseHandle(Sem);
return 0;
}
else
{
continue;
}
}
system("Pause");
return 0;
}