实验一进程同步文档格式.docx

上传人:b****4 文档编号:17088681 上传时间:2022-11-28 格式:DOCX 页数:8 大小:39.66KB
下载 相关 举报
实验一进程同步文档格式.docx_第1页
第1页 / 共8页
实验一进程同步文档格式.docx_第2页
第2页 / 共8页
实验一进程同步文档格式.docx_第3页
第3页 / 共8页
实验一进程同步文档格式.docx_第4页
第4页 / 共8页
实验一进程同步文档格式.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

实验一进程同步文档格式.docx

《实验一进程同步文档格式.docx》由会员分享,可在线阅读,更多相关《实验一进程同步文档格式.docx(8页珍藏版)》请在冰豆网上搜索。

实验一进程同步文档格式.docx

系统开辟了一个缓冲区,大小由buffersize指定。

程序中有三个链队列,一个链表。

一个就绪队列(ready),

两个等待队列:

生产者等待队列(producer);

消费者队列

(consume!

)。

一个链表(over),用于收集已经运行结束的进程本程序通过函数模拟信号量的原子操作。

2)算法的文字描述:

大致由三个模块组成:

a.主程序(main):

i.创建信号量、共享内存并进行初始化

ii.创建生产者、消费者进程,生产者执行

pro_fun(),消费者执行con_fun()

iii.等待所有子进程的结束

iv.删除信号量、共享内存

b.生产者进程(pro_fun):

i.通过key获得信号量、共享内存的ID,将内存添加到自己的地址空间

ii.P(empty),P(mutex),Add(data),V(mutex),V(full)

iii.解除和共享内存的关联

c.消费者进程(con_fun):

ii.P(full),P(mutex),Add(data),V(mutex),

V(empty)

d.循环队列部分:

加入数据:

info[end]=value;

end=(end+1)%3;

取出数据:

temp=info[start];

info[start]=0;

(start=start+1)%3;

returntemp;

3•生产者及消费者解决流程

同步问题:

P进程不能往满的缓冲区放产品,设置信号量empty,初值为0,用于指示空缓冲区数目。

V进程不能从空的缓冲区取产品,设置信号量

full,初值为0,用于知识满缓冲区数目。

解决流程:

P:

V:

Repeat:

repeat:

生产个产品;

p(full);

送产品到缓冲区;

从缓冲区取产品;

V(full);

V(empty);

P(empty);

消费产品

Untilfalse

untilfalse

生产者进程:

 

Ppoducei*

3finish

produeingf

position[

01:

3

Consiiwei*

4request

tocon&

uiite1product

Ppoducep

2sendstheproduce

require・

Pp&

ducep

2begin

taproduce

atposition

Producer

2finish

producing

positionL

11:

2

Producep

1fiendstheproduce

Fequipft・

1begfin

toproduce

1fin

produeingr

position[

21:

1

Gonsuwer

4begrinto

consune

1pi^oduct

Consutiier

4tinconsunincf

1:

position[

-1

Consumer

tocon^uite3produet

Consuiier

4he^finto

con^utie

3product

Con&

umep

4finishconsult)ing

3:

positinnE

0i:

Consumet*

toconsuiite2ppoduct

ConGUtneF

4beginto

2pFGduct

Consunet*

4finishconsuming

2:

positian[

11:

T

Pressanykeytocontinue

4)实验结果

三.实验源代码

#includevwindows・h>

#includeviostream>

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);

BUFFER-

g_hFullSemaphore

CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF

1,NULL);

g_hEmptySemaphore

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

//总的线程数

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,Cons

umer,NULL,0,&

consumerID[i]);

while(g_continue){

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

g_continue=false;

return0;

voidProduce()

std:

:

cerr<

<

"

Producing"

<

++ProductID<

..."

;

Succeed"

std:

endl;

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

voidAppend()

Appendingaproduct..."

g_buffer[in]=ProductID;

in=(in+1)%SIZE_OF_BUFFER;

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

SIZE_OF_BUFFER;

++i){std:

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;

if(i==out)std:

//消耗一个产品

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);

}return0;

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

当前位置:首页 > 党团工作 > 党团建设

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

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