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