本例中定义了一个信号量,该信号量只允许最多两个访问者同时对资源进行访问。而程序中有三个访问者,因此第三个访问者就要等前两个访问者结束后才能进行访问。
与信号量的第一种应用(同步)不同的是,同步应用中,信号量的初始值是0,而本应用中,信号量的初始值为2,即允许同时访问资源的最大线程数。
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <Windows.h>
HANDLE hSemaphore;
/*访问者*/
unsigned _stdcall Visitor1(void* param)
{
while (1)
{
WaitForSingleObject(hSemaphore, INFINITE);
printf("访问者1\n");
Sleep(1000);
ReleaseSemaphore(hSemaphore, 1, NULL);
}
return 0;
}
unsigned _stdcall Visitor2(void* param)
{
while (1)
{
WaitForSingleObject(hSemaphore, INFINITE);
printf("访问者2\n");
Sleep(2000);
ReleaseSemaphore(hSemaphore, 1, NULL);
}
return 0;
}
unsigned _stdcall Visitor3(void* param)
{
while (1)
{
WaitForSingleObject(hSemaphore, INFINITE);
printf("访问者3\n");
Sleep(3000);
ReleaseSemaphore(hSemaphore, 1, NULL);
}
return 0;
}
int main()
{
hSemaphore = CreateSemaphore(NULL, 2, 2, NULL);
HANDLE h1 = (HANDLE)_beginthreadex(NULL, 0, Visitor1, NULL, NULL, NULL);
HANDLE h2 = (HANDLE)_beginthreadex(NULL, 0, Visitor2, NULL, NULL, NULL);
HANDLE h3 = (HANDLE)_beginthreadex(NULL, 0, Visitor3, NULL, NULL, NULL);
const HANDLE handles[3] = { h1, h2, h3 };
WaitForMultipleObjects(3, handles, TRUE, INFINITE);
CloseHandle(h1);
CloseHandle(h2);
CloseHandle(h3);
system("pause");
return 0;
}