WIN32 多线程吃字母练习

这是一个关于多线程编程的实践案例,涉及4个吃货线程和1个资源管理线程。资源管理线程将字母从资源区放入两个缓冲区中,而吃货线程则从缓冲区取出字母。通过信号量实现对缓冲区的互斥访问和同步控制,确保在缓冲区为空时从资源区取字母,且吃货线程的最大并发数限制为2。
摘要由CSDN通过智能技术生成

题目大意

在这里插入图片描述
有1个资源区,2个缓冲区(大小为1),4个吃货,总共有5个线程,其中一个线程从资源区取字母放到缓冲区,哪个缓冲区是空的就往哪放;4个吃货线程,从缓冲区吃字母。

该题目要求实现对缓冲区的互斥访问,缓冲区和资源区必须满足“缓冲区为空,才能从资源区取字母”的同步要求,缓冲区和吃货线程要满足“缓冲区不空,吃货才能从缓冲区取字母”的同步要求;除此之外,还要求使用信号量控制吃货线程最大并发数为2.

运行结果

在这里插入图片描述

代码

// EatChar.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

HANDLE evtBuffer1Empty, evtBuffer2Empty, evtBuffer1Full, evtBuffer2Full;
HANDLE hSemaphore;
char szBufferRes[100];
char szBuffer1[2], szBuffer2[2];
char szBufferEat[4][100];
HWND hEditEat[4];
HWND hEditRes, hEditBuffer1, hEditBuffer2;
// 负责从资源区取字符,放到缓冲区
// 使用事件实现对缓冲区的互斥访问
// 不使用MUTEX或CRITICAL_SECTION是因为事件能实现同步
// 同步的意思是要确保缓冲区为空才往里面存字符
DWORD WINAPI ThreadCharToBuffer(LPVOID)
{
   
	// 只要资源区还有东西,就一直取
	while (szBufferRes[0] != 0)
	{
   
		Sleep(500);
		// 先看看缓冲区1是否为空,不等待立即返回
		DWORD dwRet = WaitForSingleObject(evtBuffer1Empty, 0);
		// 如果1空,那么往1放一个字符
		if (dwRet == WAIT_OBJECT_0)
		{
   
			szBuffer1[0] = szBufferRes[0];
			//strcpy(szBufferRes, szBufferRes+1);
			memcpy(szBufferRes, szBufferRes+1, strlen(szBufferRes));
			SetWindowText(hEditRes, szBufferRes);
			SetWindowText(hEditBuffer1, szBuffer1);
			SetEvent(evtBuffer1Full);
			continue;
		}
		else
		{
   
			// 1还有东西,尝试往2里放
			dwRet = WaitForSingleObject(evtBuffer2Empty, 0);
			if (dwRet == WAIT_OBJECT_0)
			{
   
				szBuffer2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值