2025年操作系统进程同步互斥实验攻略与实践解析.docx
《进程同步与互斥》试验汇报
试验序号:01试验项目名称:进程同步与互斥
学号
姓名
专业、班
试验地点
指导教师
时间
一、试验目的
1、掌握基本的进程同步与互斥算法,理解生产者-消费者问题。
2、学习使用Windows/XP中基本的同步对象,掌握有关API的使用措施。
3、理解Windows/XP中多线程的并发执行机制,实现进程的同步与互斥。
4、设计程序,实现生产者-消费者进程(线程)的同步与互斥;
二、试验环境
Windows/XP+VisualC++6.0
三、试验内容
以生产者-消费者模型为根据,在Windows/XP环境下创立一种控制台进程,在该进程中创立n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。
四、设计思绪和流程框图
生产者进程的功能:生产东西,供消费者消费;消费者进程的功能:消费生产者生产的东西。生产者生产产品并存入缓冲区供消费者取走使用,消费者从缓冲器内取出产品去消费。在生产者和消费者同步工作时,必须严禁生产者将产品放入已装满的缓冲器
内
内,严禁消费者从空缓冲器内取产品。
生产者进程
消费者进程
五、源程序(含注释)清单
#includewindows.h#includefstream.h#includestdio.h
#includestring
#includeconio.h//定义某些常量;
//本程序容许的最大临界区数;#defineMAX_BUFFER_NUM10
//秒到微秒的乘法因子;
#defineINTE_PERSEC1000
//本程序容许的生产和消费线程的总数;#defineMAX_THREAD_NUM64
//定义一种构造,记录在测试文献中指定的每一种线程的参数structThreadInfo
{
intserial;//线程序列号
charentity;//是P还是C
doubledelay;//线程延迟
intthread_request[MAXTHREAD_NUM];//线程祈求队列
intn_request;//祈求个数
};
//全局变量的定义
//临界区对象的申明,用于管理缓冲区的互斥访问;CRITICAL_SECTIONPC_Critical[MAX_BUFFER_NUM];
intBuffer_Critical[MAX_BUFFER_NUM];//缓冲区申明,用于寄存产品;
HANDLEh_Thread[MAX_THREAD_NUM];//用于存储每个线程句柄的数组;
ThreadInfoThread_Info[MAX_THREAD_NUM];HANDLEempty_semaphore;
HANDLEh_mutex;
DWORDn_Thread=0;
//线程信息数组;//一种信号量;//一种互斥量;
//实际的线程的数目;
DWORDn_Buffer_or_Critical;//实际的缓冲区或者临界区的数
目;
HANDLEh_Semaphore[MAX_THREAD_NUM];//生产者容许消费者开始消费的信号量;
//生产消费及辅助函数的申明voidProduce(void*p);
voidConsume(void*p);
boolIfInOtherRequest(int);intFindProducePositon();
intFindBufferPosition(int);
intmain(void){
//申明所需变量;
DWORDwait_for_all;
ifstreaminFile;
//初始化缓冲区;
for(inti=0;iMAX_BUFFER_NUM;i++)
Buffer_Critical[i]=-1;
//初始化每个线程的祈求队列;
for(intj=0;jMAX_THREAD_NUM;j++){
for(intk=0;kMAX_THREAD_NUM;k++)
Thread_Info[j].thread_request[k