实验三生产者与消费者Word格式.docx

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

实验三生产者与消费者Word格式.docx

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

实验三生产者与消费者Word格式.docx

1.Windows下:

Windows8,Visualstudio2013

2.Linux下:

LinuxUbuntu4,gcc

四、程序设计与实现

A.主要函数说明:

(1)PROCESS_INFORMATIONStartClone(intnCloneID)

功能:

用来创建5个相同的进程,前两个为生产者,后三两个为消费者,赋予其不同的ID值,返回进程的信息。

(2)CreateSemaphore();

创建3个信号量:

full,empty,mutex。

来互斥的访问缓冲区,实现通信。

(3)CreateFileMapping()

在当前运行的进程中创建文件映射对象,来模拟共享缓冲区

MapViewOfFile()

在此文件映射上创建视图映射到当前应用程序的地址空间

B.程序流程图

 

开始

初始化:

创建的子进程个数为0

nClone=0;

full,empty,mutex

创建共享内存

创建5个相同的子进程

nClone++

nClone=

申请缓冲区

P(empty)

P(mutex)

把产品放入缓冲区:

将0置为1

释放缓冲区:

V(mutex)

V(full)

随机等待

12次放完了

P(full)

从缓冲区取产品:

将1置为0

V(empty)

12次取完了

等待子进程执行完毕

结束每个子进程

结束

0<

nClone<

3

2<

6

N

Y

实验代码如下:

Windows:

pp:

定义控制台应用程序的入口点。

n"

);

hMutexMapping=CreateMutex(NULL,true,"

mutex"

HANDLEhMapping=CreateFileMapping(

NULL,

PAGE_READWRITE,

0,

sizeof(LONG),

"

map"

if(hMapping!

=INVALID_HANDLE_VALUE)

{

LPVOIDpData=MapViewOfFile(

hMapping,

FILE_MAP_ALL_ACCESS,

0);

if(pData!

=NULL)

ZeroMemory(pData,sizeof(LONG));

}

structbuf*pnData=reinterpret_cast<

structbuf*>

(pData);

pnData->

read=0;

write=0;

num=0;

memset(pnData->

buffer,0,sizeof(pnData->

buffer));

UnmapViewOfFile(pData);

CreateSemaphore(NULL,3,3,"

EMPTY"

CreateSemaphore(NULL,0,3,"

FULL"

BOOLbCreateOK=StartClone();

if(!

bCreateOK)

n"

else

ReleaseMutex(hMutexMapping);

}

voidProductor(intn)

{

intj;

printf("

Productorisrunning.\n"

hMutexMapping=OpenMutex(MUTEX_ALL_ACCESS,true,"

HANDLEhMapping=OpenFileMapping(

if(hMapping==INVALID_HANDLE_VALUE)

error\n"

HANDLEsemEmpty=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"

HANDLEsemFull=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"

for(inti=0;

i<

6;

i++)

WaitForSingleObject(semEmpty,INFINITE);

SYSTEMTIMEst;

GetSystemTime(&

st);

srand((unsigned)time(0));

Sleep(rand()/6);

WaitForSingleObject(hMutexMapping,INFINITE);

LPVOIDpFile=MapViewOfFile(

if(pFile!

(pFile);

buffer[pnData->

write]=1;

write=(pnData->

write+1)%3;

num++;

%02d:

%02d生产者[%d]生产成功缓冲区中剩余%d个"

,,,n,pnData->

num);

for(j=0;

j<

3;

j++)

%d"

pnData->

buffer[j]);

\n"

UnmapViewOfFile(pFile);

pFile=NULL;

ReleaseSemaphore(semFull,1,NULL);

生产者[%d]生产完毕\n"

n);

voidConsumer(intn)

Consumerisrunning.\n"

4;

WaitForSingleObject(semFull,INFINITE);

read]=0;

read=(pnData->

read+1)%3;

num--;

%02d消费者[%d]消费成功缓冲区中剩余%d个"

ReleaseSemaphore(semEmpty,1,NULL);

消费者[%d]消费完毕\n"

intmain(intargc,char**argv)

if(argc>

1&

&

strcmp(argv[1],"

productor"

)==0)

Productor(atoi(argv[2]));

elseif(argc>

consumer"

Consumer(atoi(argv[2]));

Parent();

WaitForMultipleObjects(num,lpHandle,true,INFINITE);

return0;

Linux下代码:

;

exit

(1);

}

sputproduct%ld:

%ld"

argv[0],,;

printf("

Nowthebufferis"

for(j=1;

j<

=3;

j++)

%4d"

(out+j)->

buf);

v(sem_id,SEM_MUTEX);

sgetproduct%ld:

v(sem_id

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

当前位置:首页 > 法律文书 > 判决书

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

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