北邮操作系统进程同步实验报告及源代码Word格式文档下载.docx

上传人:b****5 文档编号:17534842 上传时间:2022-12-07 格式:DOCX 页数:7 大小:197.37KB
下载 相关 举报
北邮操作系统进程同步实验报告及源代码Word格式文档下载.docx_第1页
第1页 / 共7页
北邮操作系统进程同步实验报告及源代码Word格式文档下载.docx_第2页
第2页 / 共7页
北邮操作系统进程同步实验报告及源代码Word格式文档下载.docx_第3页
第3页 / 共7页
北邮操作系统进程同步实验报告及源代码Word格式文档下载.docx_第4页
第4页 / 共7页
北邮操作系统进程同步实验报告及源代码Word格式文档下载.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

北邮操作系统进程同步实验报告及源代码Word格式文档下载.docx

《北邮操作系统进程同步实验报告及源代码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《北邮操作系统进程同步实验报告及源代码Word格式文档下载.docx(7页珍藏版)》请在冰豆网上搜索。

北邮操作系统进程同步实验报告及源代码Word格式文档下载.docx

在这个程序里我设计了三个函数:

Intmain()是主函数,其中包含了缓冲区大小的设置,生产者消费者发出请求等容以及线程创建等容

DWORDWINAPIproducer(LPVOIDlpPara)是生产者等待缓冲区的使用权并对缓冲区进行操作

DWORDWINAPIconsumer(LPVOIDlpPara)是消费者等待缓冲区的使用权并对缓冲区进行操作

该程序模拟生产者消费者问题,首先要设置缓冲区的大小,输入请求资源的各个进程的信息以及请求时间,并且按照请求时间对各进程进行排序,创建线程,然后按序依次对缓冲区进行操作,详细设计见源代码。

5、程序运行结果截图:

只有生产者请求,没有消费者请求,请求满足

只有消费者请求,没有生产者请求,消费者的请求不成功:

生产者请求大于消费者请求并且消费者请求在生产者放入产品之后:

消费者请求多于生产者请求,只能满足部分消费者请求,不能满足全部:

6、源代码:

#include<

cstdio>

cstdlib>

cstring>

iostream>

algorithm>

windows.h>

usingnamespacestd;

#defineMAX_BUF1000

#defineMAX_REQ20

HANDLEmutex;

HANDLEfull;

HANDLEempty;

HANDLEthread[MAX_REQ];

DWORDpro_id[MAX_REQ];

DWORDcon_id[MAX_REQ];

structrequest{

inttype;

//记录生产者消费者的类型

intseq;

//记录请求次序

}req[MAX_REQ];

intbuf_size;

intreq_size;

intno;

intbuffer[MAX_BUF];

intin;

intout;

intresult;

boolcmp(requesta,requestb)

{returna.seq<

b.seq;

}

DWORDWINAPIproducer(LPVOIDlpPara)

{

WaitForSingleObject(full,INFINITE);

WaitForSingleObject(mutex,INFINITE);

printf("

生产者%d将第%d号产品放入缓冲区……\n"

(int)lpPara,no);

buffer[in]=no++;

in=(in+1)%buf_size;

成功放入缓冲区!

\n\n"

(int)lpPara);

ReleaseMutex(mutex);

ReleaseSemaphore(empty,1,NULL);

return0;

}

DWORDWINAPIconsumer(LPVOIDlpPara)

WaitForSingleObject(empty,INFINITE);

消费者%d将第%d号产品从缓冲区取出……\n"

(int)lpPara,buffer[out]);

buffer[out]=0;

成功从缓冲区取出!

out=(out+1)%buf_size;

ReleaseSemaphore(full,1,NULL);

intmain()

{

inti;

intp=0;

no=1;

in=out=0;

memset(buffer,0,sizeof(buffer));

请设置缓冲区大小:

"

);

scanf("

%d"

&

buf_size);

请输入请求使用资源进程的个数:

req_size);

for(i=0;

i<

req_size;

i++){

请选择是消费者进程(0)还是生产者进程

(1):

req[i].type);

请输入该进程的请求时间:

req[i].seq);

}

sort(req,req+req_size,cmp);

mutex=CreateMutex(NULL,FALSE,NULL);

full=CreateSemaphore(NULL,buf_size,buf_size,NULL);

empty=CreateSemaphore(NULL,0,buf_size,NULL);

i++)

{

if(req[i].type==0){

thread[i]=CreateThread(NULL,0,consumer,(LPVOID)i,0,&

con_id[i]);

if(thread[i]==NULL)

return-1;

\n消费者请求从缓冲区中取产品,请求时间为%d\n"

req[i].seq);

}

if(req[i].type==1){

thread[i]=CreateThread(NULL,0,producer,(LPVOID)i,0,&

pro_id[i]);

\n生产者请求往缓冲区中放产品,请求时间为%d\n"

result=WaitForMultipleObjects(req_size,thread,TRUE,500);

if(result==WAIT_TIMEOUT)

\n请求不能被完全满足\n"

else

\n能够满足所有请求\n"

for(inti=0;

i<

i++)

CloseHandle(thread[i]);

CloseHandle(mutex);

CloseHandle(full);

CloseHandle(empty);

system("

pause"

7、实验总结:

本次实验基于书上的生产者消费者问题,原理在上课的时候老师已经详细地讲解过,但是在具体编程实现的过程中也遇到了很多问题,除了书上的库函数之外还有一些函数书上并没有给出用法,比如如何创建线程等函数,通过查阅参考相关资料解决,通过编写代码也系统地理解了生产者消费者问题的操作过程,线程的创建,信号量的创建以及信号量的使用方法等情况,遇到的好多编代码上的细节问题通过反复调试解决,有较大收获。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1