本例中定义了一个信号量,该信号量只允许最多两个访问者同时对资源进行访问。而程序中有三个访问者,因此第三个访问者就要等前两个访问者结束后才能进行访问。
与信号量的第一种应用(同步)不同的是,同步应用中,信号量的初始值是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;
}
本文通过创建一个允许两个线程同时访问的信号量,演示了如何控制多个线程对共享资源的并发访问。三个线程(访问者)试图访问资源,但只有两个可以同时进行,第三个必须等待。
1381

被折叠的 条评论
为什么被折叠?



