多线程-信号量

//信号量:多个线程运行,其它等待。

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt是一个Python的GUI编程工具包,它提供了丰富的功能和组件来创建图形用户界面。在PyQt中,多线程信号量可以用来实现并发执行和线程间的通信。 多线程是指在一个程序中同时执行多个线程,每个线程都可以独立执行不同的任务。在PyQt中,可以使用QThread类来创建和管理多线程。通过继承QThread类,并重写其run()方法,可以实现自定义的线程逻辑。在多线程中,需要注意线程间的数据共享和同步问题,可以使用信号量来进行线程间的通信和同步。 信号量是一种用于控制并发访问资源的机制。在PyQt中,可以使用QSemaphore类来创建和管理信号量。通过调用QSemaphore的acquire()方法可以获取一个信号量,如果当前信号量的值大于0,则减少信号量的值并继续执行;如果当前信号量的值为0,则阻塞线程直到有可用的信号量。通过调用QSemaphore的release()方法可以释放一个信号量,增加信号量的值。 下面是一个简单的示例代码,演示了如何在PyQt中使用多线程信号量: ```python from PyQt5.QtCore import QThread, QSemaphore class WorkerThread(QThread): def __init__(self, semaphore): super().__init__() self.semaphore = semaphore def run(self): self.semaphore.acquire() # 获取信号量 # 执行线程逻辑 print("Thread started") # 释放信号量 self.semaphore.release() # 创建一个信号量,初始值为1 semaphore = QSemaphore(1) # 创建并启动线程 thread = WorkerThread(semaphore) thread.start() # 等待线程执行完毕 thread.wait() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值