信号量实现生产者消费者问题Word格式.docx

上传人:wj 文档编号:6978731 上传时间:2023-05-07 格式:DOCX 页数:13 大小:519.36KB
下载 相关 举报
信号量实现生产者消费者问题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_第6页
第6页 / 共13页
信号量实现生产者消费者问题Word格式.docx_第7页
第7页 / 共13页
信号量实现生产者消费者问题Word格式.docx_第8页
第8页 / 共13页
信号量实现生产者消费者问题Word格式.docx_第9页
第9页 / 共13页
信号量实现生产者消费者问题Word格式.docx_第10页
第10页 / 共13页
信号量实现生产者消费者问题Word格式.docx_第11页
第11页 / 共13页
信号量实现生产者消费者问题Word格式.docx_第12页
第12页 / 共13页
信号量实现生产者消费者问题Word格式.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

信号量实现生产者消费者问题Word格式.docx

《信号量实现生产者消费者问题Word格式.docx》由会员分享,可在线阅读,更多相关《信号量实现生产者消费者问题Word格式.docx(13页珍藏版)》请在冰点文库上搜索。

信号量实现生产者消费者问题Word格式.docx

访问临界区,并输出缓冲区的值

结束

四、主要数据结构及其说明

声明一个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);

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

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2