题目大意
有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