多线程-信号量

时间:2021-01-09 20:41:04
//信号量:多个线程运行,其它等待。

//利用信号量的这一特点,也可以让信号量只有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");
}