信号量实现生产者消费者问题Word格式.docx
《信号量实现生产者消费者问题Word格式.docx》由会员分享,可在线阅读,更多相关《信号量实现生产者消费者问题Word格式.docx(13页珍藏版)》请在冰点文库上搜索。
访问临界区,并输出缓冲区的值
结束
四、主要数据结构及其说明
声明一个char类型的数组buffer,大小为10,用来做生产者和消费者共同访问的共享变量,可视做临界区。
五、程序运行时的初值和运行结果
Win32下
Linux下
六、实验体会
本实验总体感觉不是很难,就是将用信号量解决生产者消费者问题用具体的代码实现。
主要的工作就是分别在Win32和Pthread下用不同的函数名来实现P操作和V操作。
还有就是如何验证程序的正确性,就是通过没执行一次操作就输出缓冲区buffer值来判断是否符合要求。
七、源程序并附上注释
#include<
IOSTREAM.h>
STDIO.H>
windows.h>
HANDLEEmpty,full,mutex;
//声明3个信号量,互斥信号量mutex,计数信号量full和Empty
intx=0;
inty=0;
char*buffer;
//缓冲区buffer
//输出buffer
voidoutput()
{
for(inti=0;
i<
10;
i++)
{
cout<
<
buffer[i]<
"
"
;
}
cout<
\n"
}
DWORDWINAPIproduce(LPVOIDparam)
intj=0;
do
WaitForSingleObject(Empty,INFINITE);
//buffer空余量减一
WaitForSingleObject(mutex,INFINITE);
//形成互斥,只能一个线程去生产
GetCurrentThreadId()<
^^^^^"
j<
//输出当前线程的id号,和执行的次数
buffer[(y++%10)]='
A'
//生产赋值为A
output();
j++;
ReleaseSemaphore(mutex,1,NULL);
//取消互斥,允许其他线程生产
ReleaseSemaphore(full,1,NULL);
//可以消费量加1
}while(j!
=10);
//每个线程生产10次
return0;
DWORDWINAPIconsume(LPVOIDparam)
{
WaitForSingleObject(full,INFINITE);
//将可以消费量减1
//形成互斥访问,自能一个线程可以访问。
cout<
*****"
buffer[x++%10]='
B'
//消费时,赋值为B
//取消互斥,允许其他线程消费
ReleaseSemaphore(Empty,1,NULL);
//buffer空余量加1
//每个线程可以消费10次
intmain()
inti;
Empty=CreateSemaphore(NULL,10,10,NULL);
//声明计数信号量,Empty初值为10
full=CreateSemaphore(NULL,0,10,NULL);
//声明技术信号量,full初值为0
mutex=CreateSemaphore(NULL,1,1,NULL);
//申明互斥信号量,初值为1
//初始化buffer数组,大小为0
buffer=newchar[10];
for(i=0;
buffer[i]='
N'
}
//HANDLEthread;
DWORD*ThreadId=(DWORD*)malloc(10*sizeof(DWORD*));
HANDLE*ThreadHandle=(HANDLE)malloc(10*sizeof(HANDLE));
//创建线程句柄,分配空间
//创建5个生产者线程和5个消费者线程
5;
{ ThreadHandle[i+5]=CreateThread(NULL,0,produce,NULL,0,&
ThreadId[i+5]);
ThreadHandle[i]=CreateThread(NULL,0,consume,NULL,0,&
ThreadId[i]);
//让所有线程在主线程main()执行完钱全部执行完毕。
WaitForMultipleObjects(10,ThreadHandle,TRUE,INFINITE);
pthread.h>
semaphore.h>
stdio.h>
#defineBUFFER_SIZE10//缓冲区大小为10
sem_tmutex,empty,full;
//三个信号量,互斥信号量mutex,技术信号量empty和full
intx,y;
//生产者和消费者在buffer中下标
voidoutput()//输出buffer数组
for(i=0;
BUFFER_SIZE;
printf("
%c"
buffer[i]);
);
printf("
void*produce()//生产者函数
intj;
j=0;
do
sem_wait(&
empty);
//buffer有空余部分,可以生产,并减一
mutex);
//形成互斥访问,只能一个线程生产
%lu%s%d%s"
pthread_self(),"
j,"
^^^^^"
//输出当前线程的id号,以及正在执行的次数
buffer[(x++)%BUFFER_SIZE]='
//生产就赋值A
sem_post(&
//取消互斥
full);
//生成完毕,增加一个可以消费量。
}while(j!
=30);
//每个线程可以做30次
void*consume()//消费者函数
//可以消费的量减一
//互斥访问,只能一个线程消费
*****"
buffer[(y++)%BUFFER_SIZE]='
//输出buffer值
//取消互斥,其他线程可以消费
//空余量加一
//每个线程可以消费30次
x=0;
y=0;
buffer=(char*)malloc(BUFFER_SIZE*sizeof(char*));
i++)//初始化buffer数组,默认为N
//semaphore
sem_init(&
mutex,1,1);
//初始化互斥信号量mutex为1
empty,0,BUFFER_SIZE);
//初始化计数信号量empty为BUFFER_SIZE
full,0,0);
//初始化计数信号量full为0
//multipthread
pthread_ttid[10];
pthread_attr_tattr;
pthread_attr_init(&
attr);
pthread_create(&
tid[i],&
attr,consume,NULL);
tid[i+5],&
attr,produce,NULL);
//让每个线程在主线程main执行前全部执行完毕。
pthread_join(tid[i],NULL);