操作系统实验报告 生产者消费者问题

上传人:飞*** 文档编号:43665250 上传时间:2018-06-07 格式:DOC 页数:9 大小:2.47MB
返回 下载 相关 举报
操作系统实验报告   生产者消费者问题_第1页
第1页 / 共9页
操作系统实验报告   生产者消费者问题_第2页
第2页 / 共9页
操作系统实验报告   生产者消费者问题_第3页
第3页 / 共9页
操作系统实验报告   生产者消费者问题_第4页
第4页 / 共9页
操作系统实验报告   生产者消费者问题_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《操作系统实验报告 生产者消费者问题》由会员分享,可在线阅读,更多相关《操作系统实验报告 生产者消费者问题(9页珍藏版)》请在金锄头文库上搜索。

1、操作系统课程设计操作系统课程设计 实验报告实验报告 生产者消费者问题生产者消费者问题2013 年年 12 月月 25 日日一一 设计目标设计目标运用条件变量和互斥锁原理实现线程同步问题,解决生产者消费者问题1.1 背景知识说明背景知识说明在 Linux 环境下需要使用 POSIX 库进行设计实现,POSIX 是 Portable Operating System Interface of Unix 的缩写。由 IEEE(Institute of Electrical and Electronic Engineering)开发,由 ANSI 和ISO 标准化。 POSIX 的诞生和 Unix 的

2、发展是密不可分的,Unix 于 70 年代诞生于贝尔实验室,并于 80 年代向美各大高校分发 V7 版的源码以做研究。加利福尼亚大学伯克利分校在 V7 的基础上开发了 BSD Unix。后来很多商业厂家意识到 Unix 的价值也纷纷以贝尔实验室的 System V或 BSD 为基础来开发自己的 Unix,较著名的有 Sun OS,AIX,VMS。基于 posix 的线程标准库是 pthreadPOSIX 线程(POSIX Thread),简称 Pthread,是线程的POSIX 标准。该标准定义了创建和操纵线程的一整套 API。在类 Unix 操作系统(Unix、Linux、Mac OS X

3、等)中,都使用 Pthread 作为操作系统的线程。Windows 操作系统也有其移植版 pthread-win32。Pthreads 定义了一套 C 语言的类型、函数与常量,它以 pthread.h 头文件和一个线程库实现。1.2 原理原理在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。1.3 相关函数说

4、明相关函数说明数据类型pthread_t:线程句柄pthread_attr_t:线程属性操纵函数pthread_create():创建一个线程pthread_exit():终止当前线程pthread_cancel():中断另外一个线程的运行pthread_join():阻塞当前的线程,直到另外一个线程运行结束pthread_attr_init():初始化线程的属性pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)pthread_attr_getdetachstate():获取脱离状态的属性pthread_attr_destroy

5、():删除线程的属性pthread_kill():向线程发送一个信号同步函数用于 mutex 和条件变量pthread_mutex_init() 初始化互斥锁pthread_mutex_destroy() 删除互斥锁pthread_mutex_lock():占有互斥锁(阻塞操作)pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。pthread_mutex_unlock(): 释放互斥锁pthread_cond_init():初始化条件变量pthread_cond_destroy():销毁条件变量pthread_cond

6、_signal(): 唤醒第一个调用 pthread_cond_wait()而进入睡眠的线程pthread_cond_wait(): 等待条件变量的特殊条件发生Thread-local storage(或者以 Pthreads 术语,称作线程特有数据):pthread_key_create(): 分配用于标识进程中线程特定数据的键pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中pthread_key_delete(): 销毁现有线程特定数据键工具函数p

7、thread_equal(): 对两个线程的线程标识号进行比较pthread_detach(): 分离线程pthread_self(): 查询线程自身线程标识号二二 设计设计2.1 设计环境设计环境Ubuntu 12.04 LTSA:产品缓冲区空或有消费需求B:有需要且符合要求的产品概要设计-,详细设计和实现思路实现-图2.2 重要代码重要代码typedef struct int pn; buffer *pbuf; parameter;void *producer(void *arg) int i, j; parameter *p = (parameter *)arg; int tnumber

8、 = p - pn; buffer *buf = p - pbuf; printf(“prodecer %d start!n“, tnumber); for(i = 1; i lock) = 0) if(bufj - val = 0) bufj - val = tnumber; printf(“producer %d put 1 message to buffer %d!n“, tnumber, j); printf(“producer %d has produced %d message!n“, tnumber, i); if(pthread_mutex_unlock( _exit(1);

9、break; if(pthread_mutex_unlock( _exit(1); if(j = 19) j = -1; printf(“finish %d!n“, tnumber);void *consumer(void *arg) int j; parameter *p = (parameter *)arg; int tnumber = p - pn; buffer *buf = p - pbuf; int n; if(tnumber % 2 = 1) for(j = 0; ; j+) if(pthread_mutex_trylock( if(bufj - val val % 2 = 1)

10、 int i; for(i = 0; i _counti = tnumber) break; if(bufj - _counti = 0) bufj - _counti = tnumber; printf(“consumer %d take 1 copy from buffer %d, produced by %dn“, tnumber, j, n); if(bufj - _count14 != 0) bufj - val = 0; for(i = 0; i _counti = 0; break; else if(bufj - val = 11 printf(“consumer %d take

11、 1 message from buffer %d, produeced by %dn“, tnumber, j, n); else if(bufj - val 20) bufj - val = 0; printf(“consumer %d take 1 message from buffer %d, produced by %dn“, tnumber, j, n); if(pthread_mutex_unlock( _exit(1); if(j = 19) j = -1; else for(j = 0; ; j+) if(pthread_mutex_trylock( if(bufj - val val %2 = 0) bufj - val = 0; printf(“consumer %d take 1 message from buffer %d, produced by %dn“, tnumber, j, n); else if(bufj - val = 11 pr

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

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号