实验三生产者与消费者Word文档格式.docx
- 文档编号:19341636
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:21
- 大小:157.49KB
实验三生产者与消费者Word文档格式.docx
《实验三生产者与消费者Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验三生产者与消费者Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
(3)CreateFileMapping()
在当前运行的进程中创建文件映射对象,来模拟共享缓冲区
MapViewOfFile()
在此文件映射上创建视图映射到当前应用程序的地址空间
B.程序流程图
full,empty,mutex
创建共享内存
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:
//实验三.cpp:
定义控制台应用程序的入口点。
//
#include"
stdafx.h"
#include<
stdio.h>
#include<
windows.h>
time.h>
staticHANDLEhMutexMapping=INVALID_HANDLE_VALUE;
intnum=0;
HANDLElpHandle[10];
structbuf
{
intnum;
intread;
intwrite;
intbuffer[5];
};
BOOLStartClone()
inti;
BOOLbCreateOK;
PROCESS_INFORMATIONpi;
TCHARszFilename[MAX_PATH];
GetModuleFileName(NULL,szFilename,MAX_PATH);
TCHARszCmdLine[MAX_PATH];
for(i=0;
i<
3;
i++)
{
sprintf(szCmdLine,"
\"
%s\"
consumer%d"
szFilename,i);
STARTUPINFOsi;
ZeroMemory(reinterpret_cast<
void*>
(&
si),sizeof(si));
si.cb=sizeof(si);
bCreateOK=CreateProcess(
szFilename,
szCmdLine,
NULL,
FALSE,
CREATE_DEFAULT_ERROR_MODE,
&
si,
pi);
if(!
bCreateOK)
returnfalse;
}
lpHandle[num]=pi.hProcess;
num++;
2;
productor%d"
returntrue;
}
voidParent()
printf("
Creatingthechildprocessandwaitedchildprocesstoquit.\n"
);
hMutexMapping=CreateMutex(NULL,true,"
mutex"
HANDLEhMapping=CreateFileMapping(
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();
//printf("
Createchildprocessfailed.\n"
else
Createchildprocesssuccess.\n"
ReleaseMutex(hMutexMapping);
voidProductor(intn)
intj;
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;
6;
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个"
st.wHour,st.wMinute,st.wSecond,n,pnData->
num);
for(j=0;
j<
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下代码:
//主进程
unistd.h>
stdlib.h>
head.h"
intmain()
{
intid=semget(SEM_ALL_KEY,3,IPC_CREAT|0660);
//创建信号量集合
//初始化信号量集合
semctl(id,SEM_EMPTY,SETVAL,3);
semctl(id,SEM_FULL,SETVAL,0);
semctl(id,SEM_MUTEX,SETVAL,1);
intshmid=createQueue();
//创建共享主存
if(shmid<
0)
perror("
createshmerror."
exit
(1);
}
//生成生产者进程
if(fork()==0)
execl("
producer"
"
producer1"
0);
producer2"
//生成消费者进程
consumer1"
consumer2"
consumer3"
//等待子进程
intstat,i;
for(i=0;
i<
5;
i++)
wait(&
stat);
removeQueue(shmid);
//释放共享主存return0;
/*生产者*/
main(intargc,char*argv[])
structqueue*buf,*out;
intsem_id=semget(SEM_ALL_KEY,3,IPC_CREAT|0660);
inti,j;
buf=getQueue();
//打开共享主存
out=buf;
6;
p(sem_id,SEM_EMPTY);
//P(EMPTY),EMPTY开始值为3,表明有三个空余,申请一个之后,有两个空余,当为零时,不再往里面写数据
p(sem_id,SEM_MUTEX);
//P(MUTEX),MUTEX开始值为1,表明一次只能运行一个进程
buf->
buf++;
//产品数+1
(buf+buf->
buf)->
buf=1;
//放入产品后缓冲区置1
//获取当前时间
structtimevalcurtime;
gettimeofday(&
curtime,NULL);
//输出信息
printf("
No.%sputproduct%ld:
%ld"
argv[0],curtime.tv_sec,curtime.tv_usec);
Nowthebufferis"
for(j=1;
j<
=3;
j++)
%4d"
(out+j)->
buf);
v(sem_id,SEM_MUTEX);
//V(MUTEX)
v(sem_id,SEM_FULL);
//V(FULL),释放一个FULL,即往里面写了一个数据
//随机sleep一会
intran=random()%5;
sleep(ran);
/*消费者*/
intsem_id=semget(SEM_ALL_KEY,3,IPC_CREAT|0660);
4;
p(sem_id,SEM_FULL);
//P(FULL)FULL开始值为0,表明开始的时候没有数据,无法取得,当producer释放一个数据时,这里开始有数据
//P(MUTEX)
buf=0;
//取出产品后缓冲区置0
buf--;
//产品数-1
No.%sgetproduct%ld:
v(sem_id,SEM_EMPTY);
//V(EMPTY)
//随机等待一段时间
Windows运行截图:
Linux下截图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 生产者 消费者