一、实验内容
1.问题描述:冰箱里有一片区域可以存放若干盒牛奶。爸爸负责不停地往里面放置鲜奶,妈妈负责不停地往里面放置酸奶,姐姐不停地取出鲜奶享用,弟弟则不停地取出酸奶。
约定:爸爸、妈妈、姐姐、弟弟四人不可以同时使用冰箱取放牛奶。
2.功能要求:根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放数据、取数据等过程。
二、背景知识
1.同步机制遵循的规则,临界资源的管理。
三、思路
先把生产者妈妈和爸爸一放进一盒牛奶,牛奶数量就加一。消费者姐姐和弟弟一取一盒牛奶,牛奶数量就减一。主函数先写一个函数来录入想要放几盒牛奶的数量。之后需要创建冰箱,鲜奶,酸奶的信号量,创建线程,等待子程序结束和关闭句柄。
四、核心代码
#include <string>
#include <iostream>
#include <process.h>
#include <windows.h>
using namespace std;
HANDLE xiannai, suannai, bingxiang; //同步信号量 鲜奶 酸奶 冰箱
int buf_max; //冰箱可以放牛奶的最大容量
int product_xiannai = 0, product_suannai = 0; //产品鲜奶,酸奶数量
//爸爸放鲜奶的过程
unsigned __stdcall dadToxiannai(void *) {
while (1) {
WaitForSingleObject(bingxiang, INFINITE);//等待同步信号量empty INFINITE代表无穷等待
product_xiannai++;
cout << "爸爸放了一盒鲜奶,鲜奶的数量为:" << product_xiannai << endl << endl;
Sleep(100);
ReleaseSemaphore(xiannai, 1, NULL);//释放同步信号量full
}
return 1;
}
//妈妈放酸奶的过程
unsigned __stdcall momToSuannai(void *) {
while (1) {
WaitForSingleObject(bingxiang, INFINITE);//等待同步信号量empty INFINITE代表无穷等待
product_suannai++;
cout << "妈妈放了一盒酸奶,酸奶的数量为:" << product_suannai << endl << endl;
Sleep(100);
ReleaseSemaphore(suannai, 1, NULL);//释放同步信号量full
}
return 1;
}
//姐姐取鲜奶的过程
unsigned __stdcall sisterQuXiannai(void *) {
while (1) {
WaitForSingleObject(xiannai, INFINITE);//等待同步信号量full
product_xiannai--;
cout << "姐姐取了一盒鲜奶,剩余鲜奶的数量为:" << product_xiannai << endl << endl;
Sleep(100);
ReleaseSemaphore(bingxiang, 1, NULL);//释放信号量
//如果此时鲜奶的数量为0,但是显示为1,不然就循环不了
}
return 2;
}
//弟弟取酸奶的过程
unsigned __stdcall brotherQuSuannai(void *) {
while (1) {
WaitForSingleObject(suannai, INFINITE);//等待同步信号量full
product_suannai--;
cout << "弟弟取了一盒酸奶,剩余酸奶的数量为:" << product_suannai << endl << endl;
Sleep(100);
ReleaseSemaphore(bingxiang, 1, NULL);//释放信号量
如果此时酸奶的数量为0,但是显示为1,不然就循环不了
}
return 2;
}
int main() {
bool flag = false;
while (!flag) {
cout << "请输入冰箱最多可以放几盒牛奶(大于0):" << endl;
cin >> buf_max;
if (buf_max <= 0);
else
flag = true;
}
//创建信号量
bingxiang = CreateSemaphore(NULL, buf_max, buf_max, NULL);//初值化冰箱容量
xiannai = CreateSemaphore(NULL, 0, buf_max, NULL); //初值为0,最大为冰箱容量
suannai = CreateSemaphore(NULL, 0, buf_max, NULL); //初值为0,最大为冰箱容量
//mutex = CreateSemaphore(NULL, 1, 1, NULL); //初值为1,最大为1
HANDLE hth1, hth2, hth3, hth4;
//创建线程
hth1 = (HANDLE)_beginthreadex(NULL, 0, dadToxiannai, NULL, 0, NULL);
hth2 = (HANDLE)_beginthreadex(NULL, 0, momToSuannai, NULL, 0, NULL);
hth3 = (HANDLE)_beginthreadex(NULL, 0, brotherQuSuannai, NULL, 0, NULL);
hth4 = (HANDLE)_beginthreadex(NULL, 0, sisterQuXiannai, NULL, 0, NULL);
//等待子线程结束
WaitForSingleObject(hth1, INFINITE);
WaitForSingleObject(hth2, INFINITE);
WaitForSingleObject(hth3, INFINITE);
WaitForSingleObject(hth4, INFINITE);
//关闭句柄
CloseHandle(hth1);
CloseHandle(hth2);
CloseHandle(hth3);
CloseHandle(hth4);
CloseHandle(bingxiang);
CloseHandle(xiannai);
CloseHandle(suannai);
}
五,运行结果
六、结论
1.生产者消费者模式中总生产速度与总消费速度达到相对平衡可以减少系统资源浪费
2.在无法达到相对平衡速度时,让消费速度大于生产速度,虽然消费者会闲置,但是可以减少数据滞留时间
3.在生产者消费者模式链中找到处理最慢环节加以优化可以提升系统性能
4.在系统性能已达标的情况下减少除最慢环节意外部分的线程数可以减少系统资源消耗(多线程模式)