#include<iostream>
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef HANDLE Semaphore; //信号量的定义
typedef int size; //数据大小定义
typedef int Boundary; //缓冲区边界定义
typedef int Buffer_Kind; //定义缓冲区数据类型
typedef int kind_of_request; //请求类型
typedef int Time; //定义时间类型
typedef int Process_Kind;
typedef int Sequence_number;
/*最大缓冲区*/
const size MAX_BUFFER = 256;
const size MAX_REQUEST=20;
typedef struct node
{
Process_Kind con_or_prod; //请求者的类型
Time consume_time; //占用时间
}Pro;
/*缓冲区的边界设置 实现一个循环队列*/
Boundary on; //上边界
Boundary off; //下边界
/*定义缓冲区数组(队列)*/
Buffer_Kind buffer[MAX_BUFFER] ;
/*定义请求队列(包含请求的进程类型,进程所占用的时间)*/
Pro request[MAX_REQUEST];
/*定义三个信号量
mutex(对仓库访问的控制),empty(消费者消费的控制量),full(生产者生产的控制量)
*/
Semaphore mutex ;
Semaphore full ;
Semaphore empty;
HANDLE total_thread[MAX_REQUEST]; //总线程
/*定义生产者和消费者的队列*/
DWORD product_id[MAX_REQUEST] ; //生产者队列
DWORD consume_id[MAX_REQUEST]; //消费者队列
Sequence_number product_number; //生产者的标号
Process_Kind PRODUCT ; //生产者
Process_Kind CONSUME; //消费者
/*用户输入*/
size BUFFER_SIZE; //仓库大小
size REQUEST_NUM;//请求的个数
/*主控制程序*/
int Process_Control();
void Initialization();
/*系统调用的接口(生产者的系统调用)*/
DWORD WINAPI producer(LPVOID lpPara);
/*系统调用的接口(消费者的系统调用)*/
DWORD WINAPI consumer(LPVOID lpPara);
void Initialization()
{
product_number=1;
on=off=0;
memset(buffer ,0, sizeof(buffer)) ;
cout<<" \t \t 这是一个简单的进程(线程模拟实验) \t\t"<<endl;
cout<<"请输入仓库的大小: "<<endl;
cin>>BUFFER_SIZE;
cout<<"请输入总的线程数:"<<endl;
cin>>REQUEST_NUM;
char ch;
Time temptime;//临时的一个保存时间的变量
for(int i=0; i<REQUEST_NUM; i++)
{
cout<<"请输入第"<<i<<"个创建进程的请求(类型和占用时间) : ";
cin>>ch>>temptime;
request[i].consume_time=temptime;
request[i].con_or_prod=ch;
}
}
DWORD WINAPI producer(LPVOID lpPara)
{
WaitForSingleObject(full, INFINITE); //等待空位
WaitForSingleObject(mutex, INFINITE); //对仓库的操作权
/*跳过生产过程
pa pa pa pa
*/
cout<<"生产者"<<(int)lpPara<<"正在生产产品放在"<<product_number<<endl;
buffer[on]=++product_number;
on=(on+1)%BUFFER_SIZE;
Sleep(5);
cout<<"生产者"<<(int)lpPara<<"生产成功!!"<<endl<<endl;
ReleaseMutex(mutex); //释放仓库操作权
ReleaseSemaphore(empty, 1, NULL); //非空位加一
return 0;
}
DWORD WINAPI consumer(LPVOID lpPara)
{
WaitForSingleObject(empty, INFINITE);//等待非空位
WaitForSingleObject(mutex, INFINITE); //对仓库的操作权
//开始从仓库取出产品
cout<<"消费者"<<(int)lpPara<<"正在进行消费第"<<buffer[off]<<"产品......"<<endl;
buffer[off]=0;
off=(off+1)%BUFFER_SIZE;
Sleep(5);
cout<<"消费者"<<(int)lpPara<<"消费成功。。。"<<endl;
/*
跳过消费过程
pa pa pa pa
*/
ReleaseMutex(mutex); //释放对仓库的操作权
ReleaseSemaphore(full, 1, NULL); //空位加一
return 0;
}
int Process_Control()
{
Initialization(); //初始化各变量
//创建各个互斥信号
mutex=CreateMutex(NULL, false, NULL);
full=CreateSemaphore(NULL, BUFFER_SIZE, BUFFER_SIZE, NULL);
empty=CreateSemaphore(NULL, 0, BUFFER_SIZE, NULL);
int pre=0; //上一个请求的时间
for(int i=0; i<REQUEST_NUM; i++)
{
if(request[i].con_or_prod=='P') //创建生产者线程
{
total_thread[i]=CreateThread(NULL, 0, producer, (LPVOID)i, 0, &product_id[i]);
if(total_thread[i]==NULL)
return -1;
cout<<"请求"<<request[i].consume_time<<"在: ..."<<"进程"<<i<<"正在放置产品在仓库中"<<endl;
}
else //创建消费者线程
{
total_thread[i]=CreateThread(NULL, 0, consumer, (LPVOID)i, 0, &consume_id[i]);
if(total_thread[i]==NULL)
return -1;
cout<<"请求"<<request[i].consume_time<<"在: ..."<<"进程"<<i<<"正在消耗仓库中的产品"<<endl;
}
Sleep(request[i].consume_time-pre); //模拟时间
pre=request[i].consume_time;
}
//等待所有线程结束或超时,返回请求答复结果
Time nIndex = WaitForMultipleObjects(REQUEST_NUM, total_thread, TRUE, 500);
if (nIndex == WAIT_TIMEOUT)
{
cout<<"某些进程的需求无法被实现"<<endl;
}
else
{
cout<<"所有的需求都能被满足"<<endl;
}
//销毁线程和信号量,防止线程的内存泄露
for(int i=0; i<REQUEST_NUM; i++)
CloseHandle(total_thread[i]);
CloseHandle(mutex);
CloseHandle(full);
CloseHandle(empty);
}
int main()
{
Process_Control();
system("pause");
return 0;
}
进程同步(操作系统实验三,带实验报告哦,亲)
4星 · 超过85%的资源 需积分: 49 185 浏览量
2012-11-26
12:46:30
上传
评论 12
收藏 523KB ZIP 举报
longxia7758748
- 粉丝: 1
- 资源: 8
最新资源
- 流程图转PAD-N-S图和伪码(软件工程).doc
- C#winform excel导入导出
- 毕业论文上传111111111111
- raisin.zip
- 322个地级市-市场分割指数、市场一体化指数+居民消费价格指数(2004-2022年).txt
- 《基于Java实现自定义控件-天气温度折线图 》+源代码+设计资料
- 希尔伯特矩阵来综合演示数值矩阵与符号矩阵的基本操作
- 《基于51单片机和DS18B20的温度检测和报警系统,可设置报警温度上下限,输出温度采用数码管显示 》+源代码+设计资料
- ESP8266WIFI系统工作原理图.schdoc
- C语言《基于STM32的测量温度与压力的数据处理设计 》+源代码+设计资料
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈