生产者与消费者实验报告Word下载.docx

上传人:b****6 文档编号:15987534 上传时间:2022-11-17 格式:DOCX 页数:10 大小:94.08KB
下载 相关 举报
生产者与消费者实验报告Word下载.docx_第1页
第1页 / 共10页
生产者与消费者实验报告Word下载.docx_第2页
第2页 / 共10页
生产者与消费者实验报告Word下载.docx_第3页
第3页 / 共10页
生产者与消费者实验报告Word下载.docx_第4页
第4页 / 共10页
生产者与消费者实验报告Word下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

生产者与消费者实验报告Word下载.docx

《生产者与消费者实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《生产者与消费者实验报告Word下载.docx(10页珍藏版)》请在冰豆网上搜索。

生产者与消费者实验报告Word下载.docx

(1)既存在合作同步问题,也存在临界区互斥问题

合作同步:

当缓冲池全满时,表示供过于求,生产者必须等待,同时唤醒消费者;

当缓冲池全空时,表示供不应求,消费者应等待,同时唤醒生产者。

互斥:

缓冲池显然是临界资源,所在生产者与消费都要使用它,而且都要改变它的状态。

(2)基于环形缓冲区的生产者与消费者关系形式描述:

公用信号量mutex:

初值为1,用于实现临界区互斥

生产者私用信号量empty:

初值为n,指示空缓冲块数目

消费者私用信号量full:

初值为0,指示满缓冲块数目

整型量i和j初值为0,i指示首空缓冲块序号,j指示首满缓冲块序号

(3)PV原语

varmutex,empty,full:

semaphore;

i,j:

integer;

buffer:

array[0...n-1]ofitem;

i:

=j:

=1;

Procedureproducer;

begin

whiletruedo

produceaproduct;

P(empty);

P(mutex);

buffer(i):

=product;

=(i+1)modn;

V(mutex);

V(full);

end;

Procedureconsumer;

P(full);

goods:

=buffer(j);

j:

=(j+1)modn;

V(empty);

consumeaproduct;

【实验源程序代码】

#include<

windows.h>

iostream>

constunsignedshortSIZE_OF_BUFFER=10;

//缓冲区长度

unsignedshortProductID=0;

//产品号

unsignedshortConsumeID=0;

//将被消耗的产品号

unsignedshortin=0;

//产品进缓冲区时的缓冲区下标

unsignedshortout=0;

//产品出缓冲区时的缓冲区下标

intg_buffer[SIZE_OF_BUFFER];

//缓冲区是个循环队列

boolg_continue=true;

//控制程序结束

HANDLEg_hMutex;

//用于线程间的互斥

HANDLEg_hFullSemaphore;

//当缓冲区满时迫使生产者等待

HANDLEg_hEmptySemaphore;

//当缓冲区空时迫使消费者等待

DWORDWINAPIProducer(LPVOID);

//生产者线程

DWORDWINAPIConsumer(LPVOID);

//消费者线程

intmain()

{

//创建各个互斥信号

g_hMutex=CreateMutex(NULL,FALSE,NULL);

g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);

g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);

//调整下面的数值,可以发现,当生产者个数多于消费者个数时,

//生产速度快,生产者经常等待消费者;

反之,消费者经常等待

constunsignedshortPRODUCERS_COUNT=3;

//生产者的个数

constunsignedshortCONSUMERS_COUNT=1;

//消费者的个数

//总的线程数

constunsignedshortTHREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;

HANDLEhThreads[PRODUCERS_COUNT];

//各线程的handle

DWORDproducerID[CONSUMERS_COUNT];

//生产者线程的标识符

DWORDconsumerID[THREADS_COUNT];

//消费者线程的标识符

//创建生产者线程

for(inti=0;

i<

PRODUCERS_COUNT;

++i){

hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&

producerID[i]);

if(hThreads[i]==NULL)return-1;

}

//创建消费者线程

for(i=0;

CONSUMERS_COUNT;

hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&

consumerID[i]);

while(g_continue){

if(getchar()){//按回车后终止程序运行

g_continue=false;

return0;

}

//生产一个产品。

简单模拟了一下,仅输出新产品的ID号

voidProduce()

std:

:

cerr<

<

"

Producing"

<

++ProductID<

..."

;

Succeed"

endl;

//把新生产的产品放入缓冲区

voidAppend()

Appendingaproduct..."

g_buffer[in]=ProductID;

in=(in+1)%SIZE_OF_BUFFER;

//输出缓冲区当前的状态

SIZE_OF_BUFFER;

cout<

i<

"

g_buffer[i];

if(i==in)std:

--生产"

if(i==out)std:

--消费"

//从缓冲区中取出一个产品

voidTake()

Takingaproduct..."

ConsumeID=g_buffer[out];

out=(out+1)%SIZE_OF_BUFFER;

//输出缓冲区当前的状态

//消耗一个产品

voidConsume()

Consuming"

ConsumeID<

//生产者

DWORDWINAPIProducer(LPVOIDlpPara)

WaitForSingleObject(g_hFullSemaphore,INFINITE);

WaitForSingleObject(g_hMutex,INFINITE);

Produce();

Append();

Sleep(1500);

ReleaseMutex(g_hMutex);

ReleaseSemaphore(g_hEmptySemaphore,1,NULL);

//消费者

DWORDWINAPIConsumer(LPVOIDlpPara)

WaitForSingleObject(g_hEmptySemaphore,INFINITE);

Take();

Consume();

ReleaseSemaphore(g_hFullSemaphore,1,NULL);

【实验结果】

具体程序见附件(网络查找)

【实验反思】

本次实验是关于生产者和消费者之间互斥和同步的问题。

问题的实质是P,V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待知道前一个线程释放缓冲区为止。

通过本次实验,我们对操作系统的P,V进一步的认识,深入的了解P,V操作的实质和其重要性。

课本的理论知识进一步阐述了现实的实际问题。

【实验思考题】

1.思考在“生产者和消费者”经典同步问题中,两个P操作是否可以互换位置,以及两个V操作是否可以互换位置。

在生产者—消费者问题中,如果将两个P操作,即P(full)和P(mutex)互换位置,或者P(empty)和P(mutex)互换位置,都可能引起死锁。

考虑系统中缓冲区全满前时,若一生产者进程先执行了P(mutex)操作并获得成功,当再执行P(empty)操作时,它将因失败而进入阻塞状态,它期待消费者执行V(empty)来唤醒自己。

在此之前,它不可能执行V(mutex)操作,从而使企图通过P(mutex)进入自己的临界区的其他生产者和所有的消费者进程全部进入阻塞状态,从而引起系统死锁。

类似地,消费者进程若先执行P(mutex),后执行P(full),同样可能造成死锁。

V(full)和V(mutex)互换位置,或者V(empty)和V(mutcx)互换位置,则不会引起死锁,其影响只是使临界资源的释放略为推迟一些。

2.思考在“哲学家就餐”经典同步问题中,如何修改程序,可以保证不会发生死锁现象。

(1)至多只允许有四位哲学家同时去拿左边的筷子,最终能保证

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

当前位置:首页 > 法律文书 > 调解书

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

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