//信号量:多个线程运行,其它等待。
//利用信号量的这一特点,也可以让信号量只有1 ,则就实现了资源共享冲突的解决。
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
//信号量一开始是 0
//这儿可以这样理解,像资源池一样。如果资源池开辟了5个,每个使用要使用时
//就拿去一个,这时资源池就减少一个。如果资源池里的资源为 0 则没有资源可以
//使用,而当使用者 使用完后归还给资源池,这时资源池的资源就会加 1。
//信号量:多个线程运行,其它等待。
//利用信号量的这一特点,也可以让信号量只有1 ,则就实现了资源共享冲突的解决。
#define id "lg" //信号名
#define MAX 3 //可用的最大信号
DWORD WINAPI demo(void *p)
{
int *pint = p;
//printf("%d\n", *pint);
//在线程里处理信号
//第一个:全部信号、第二个:一个信号与多个信号的判断、信号的名子
//打开一个信号,判断存不存在。
HANDLE myhsem = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,id); //打开一个信号
if (myhsem)//如果找到信号
{
printf("myworker %d is waitting\n", *pint);
//等待信号,如果信号等于 0 时就一直在等待,直到有信号资源可用
//不为 0 时,信号减 1(一开始设置信号的最大量为 MAX,每进一个信号减 1,直到信号为 0 时没有信号资源可用。)
if (WaitForSingleObject(myhsem, INFINITE) == WAIT_OBJECT_0)
{
printf("myworker %d is entering\n", *pint);
Sleep(3000);
printf("myworker %d is leaving\n", *pint);
ReleaseSemaphore(myhsem, 1,NULL); //释放信号,信号加 1
//释放资源
CloseHandle(myhsem);
}
}
}
void main()
{
//创建一个信号对象,开辟一个信号,最大信号量是 MAX
//一开始的信号资源是 0 如果不是,则一开始就执行了。
HANDLE hsem = CreateSemaphore(NULL, MAX, MAX, id);
int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
HANDLE hd[10] = { 0 };
for (int i = 0; i < 10; i++)
{
hd[i] = CreateThread(NULL, 0, demo, a + i, 0, NULL);
}
Sleep(5000);
printf("5秒钟后激活线程......\n");
//激活线程,如果CreateSemaphore(NULL, 0, MAX, id);这时就需要使用下面的激活,如果这儿设置的不是 0 就不需要激活
//ReleaseSemaphore(hsem, MAX, NULL);//一次最多进入MAX个
WaitForMultipleObjects(10, hd, TRUE, INFINITE);
CloseHandle(hsem); //关闭信号
system("pause");
}