Windows生产者与消费者 8

在生产者与消费者实现当中,通过设定事件g_hSet和事件g_hClear两个事件对象来用于确立生产者线程对象和消费者线程对象之间的异步有序执行操作。当set事件对象处于激活状态的时候,生产者线程对象开始进行执行,生产者对象向共享容器当中投放产品,之后激活Clear事件对象,另消费者对象开始对容器当中的产品进行消费操作。消费者对象进行消费完毕之后,重新激活Set事件对象来另生产者对象重新进行产品的生产操做。

#include<stdio.h>
#include<Windows.h>
//设置事件通知对象实现用于实现不同线程对象之间的有序访问
HANDLE g_hset;//设定生产者通知事件对象用于通知生产者线程对象开始进行生产
HANDLE g_hClear;//设置消费者消费实现用于通知消费者对象进行消费操作
int g_Max = 100;//设定生产者对象所进行生产的产品数
int g_Number = 0;//设定容器用于对生产者对象所生产的产品进行接收
//生产者线程对象用于实现产品的生产
DWORD WINAPI ThreadProduct(LPVOID pH) {
	for (int i = 0; i < g_Max; i++)
	{
		//生产者对象等待生产者通知事件的通知消息,获取到g_set的通知消息之后将将事件通知改为False
		WaitForSingleObject(g_hset, INFINITE);
		g_Number = 1;
		DWORD id = GetCurrentThreadId();//获取当前生产者对象的线程ID
		printf("生产者对象%d将数据%d放入缓存区.\n", id, g_Number);
		SetEvent(g_hClear);//将消费者通知事件对象进行激活,用于唤醒消费者线程进行消费操作
	}
	return 0;
}
//消费者对象实现对共享缓存区当中的产品进行消费
DWORD WINAPI ThreadConsumer(LPVOID pH) {
	for (int i = 0; i < g_Max; i++)
	{
		//等待消费者通知事件,开始进行消费者线程对象的执行
		WaitForSingleObject(g_hClear, INFINITE);
		g_Number = 0;
		DWORD id = GetCurrentThreadId();//获取当前生产者对象的线程ID
		printf("消费者对象%d对数据%d进行消费.\n", id, g_Number);
		SetEvent(g_hset);//对生产者通知实现进行激活,让生产者对象进行生产操作
	}
	return 0;
}
int main() {
	HANDLE hThread[2];
	g_hset = CreateEvent(NULL, FALSE, TRUE, NULL);//创建生产者通知事件对象,并将事件的通知初始值参数设置为True
	g_hClear = CreateEvent(NULL, FALSE, FALSE, NULL);//创建消费者通知实现对象,并另当前的事件对象处于没有激活的状态
	hThread[0] = CreateThread(NULL, 0, ThreadProduct, NULL, 0, NULL);//实例化生产者线程对象
	hThread[1] = CreateThread(NULL, 0, ThreadConsumer, NULL, 0, NULL);//实例化消费者线程对象
	WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
	CloseHandle(hThread[0]);
	CloseHandle(hThread[1]);
	return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值