生产者消费者问题.docx

上传人:1595****071 文档编号:33799110 上传时间:2022-08-12 格式:DOCX 页数:5 大小:195.36KB
返回 下载 相关 举报
生产者消费者问题.docx_第1页
第1页 / 共5页
生产者消费者问题.docx_第2页
第2页 / 共5页
点击查看更多>>
资源描述

《生产者消费者问题.docx》由会员分享,可在线阅读,更多相关《生产者消费者问题.docx(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、_实 验 报 告四、实验原理:利用进程间共享的信号量、互斥锁等控制线程的同步。相关函数说明:信号量sem_tsem_init信号量初始化)、sem_wait(信号量值减一)、sem_post(信号量值加一)互斥量(线程)pthread_mutex_tpthread_mutex_init(互斥量初始化)pthread_mutex_lock(互斥量加锁)pthread_mutex_unlock(互斥量解锁)线程和进程pthread_t(线程)pid_t(进程)pthread_create(创建线程)fork(创建进程)pthread_join(等待线程结束)waitpid(停止目前进程的执行,直到

2、有信号来到或子进程结束)五 实验内容:1、有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池:生产者进程从文件中读取一个数据,并将它存放到一个缓冲区中; 消费者进程从一个缓冲区中取走数据,并输出此数据。生产者和消费者之间必须保持同步原则:不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。 2、创建3进程(或者线程)作为生产者,4个进程(或者线程)作为消费者。创建一个文件作为数据源,文件中事先写入一些内容作为数据。3、生产者和消费者进程(或者线程)

3、都具有相同的优先级。六 实验器材(设备、元器件)(1) 学生每人一台PC,安装WindowsXP/2000操作系统。(2) 局域网络环境。(3) 个人PC安装VMware虚拟机和Ubuntu系统。七 实验步骤(1) 实现哲学家就餐问题(2) 算法思想 在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。(3)

4、程序代码(重要代码请注释)#include #include #include #include #include /*/#define PN 2 /生产者数#define CN 3/消费者数#define M 10/缓冲区数目int in;/生产者指针int out;/消费者指针int buffM = 0 ;int productID=0, prochaseID=0; /生产者消费者idsem_t isFull;/信号量sem_t isEmpty;pthread_mutex_t mutex;/互斥信号量void* product();void* prochase();void print()

5、;int main()pthread_t prodIDPN;pthread_t procIDCN;int i = 0,j=0;int pthreadState;int state1=sem_init(&isEmpty,0,M);int state2=sem_init(&isFull,0,0);if (state1!=0|state2!=0)printf(create sem is error);exit(1);for (i = 0; i PN;i+)pthreadState = pthread_create(&prodIDi,NULL,product,(void*)(&i);if (pthre

6、adState!=0)printf(product%d creation failed n, i);exit(1);for (j = 0; j CN;j+)pthreadState = pthread_create(&procIDj, NULL, prochase, NULL);if (pthreadState != 0)printf(product%d creation failed n, j);exit(1);for (i = 0; i PN; i+)pthread_join(prodIDi,NULL);for (j = 0; j CN; j+)pthread_join(procIDj,

7、NULL);return 0;void* product()int prodID = +productID;while (1)sleep(1);sem_wait(&isEmpty);pthread_mutex_lock(&mutex);in = in%M;printf(producter %d is product in %d /n, prodID,in);buffin = 1;print();in+;pthread_mutex_unlock(&mutex);sem_post(&isFull);void* prochase()int procID = +prochaseID;while (1)

8、sleep(1);sem_wait(&isFull);pthread_mutex_lock(&mutex);out = out%M;printf(prochase %d is prochase in %d /n, procID, out);buffout = 0;print();out+;pthread_mutex_unlock(&mutex);sem_post(&isEmpty);void print()int i = 0;for (i = 0; i M; i+)printf(%d ,buffi);printf(n);八、实验及结果分析:九、实验结论、心得体会和改进建议:本次试验加深了我对于上课生产者消费者问题的理解,让我对线程之间的同步还有信号量的设置原理。5_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁