ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:19.66KB ,
资源ID:1004517      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/1004517.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(生产者消费者问题.docx)为本站会员(b****0)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

生产者消费者问题.docx

1、生产者消费者问题实训二 操作系统中的经典线程同步问题一、 实训目的:1、通过对“生产者-消费者”问题编程实现,了解线程创建、同步信号量、互斥信号量、临界区的创建和使用。 2、了解线程互斥和同步机制。3、了解PV原语和信号量在线程互斥和同步机制中的运用。二 、实训环境:一台PC机/人三、预习内容:1、进程的控制。2、进程同步。3、本实验内容主要对应于教材第2章中关于进程的各节四、实训内容:1、编写进程控制程序并运行,理解进程控制的各操作。2、生产者和消费者问题,本实验用到几个API函数:CreatThread, CreatMutex, CreatSemaphore, WaitForSingleO

2、bject, ReleaseSemaphore, ReleaseMutex, InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection这些函数的作用:CreatThread: 创建一个线程,该线程在调用进程的地址空间中执CreatMutex : 产生一个命名的或者匿名的互斥量对象。WaitForSingleObject(对应p操作)锁上互斥锁,ReleaseMutex(对应v操作)打开互斥锁。CreateSemaphore:创建一个命名的或者匿名的信号对象。信号量可以看作是在互斥量上的一个扩展。 WaitForS

3、ingleObject:使程序处于等待状态,直到信号量(或互斥量)hHandle出现或者超过规定的等待最长时间,信号量出现指信号量大于或等于1,互斥量出现指打开互斥锁。在返回之前将信号量减1或者锁上互斥锁。 ReleaseSemaphore:将所指信号量加上指定大小的一个量,执行成功,则返回非0值。 ReleaseMutex:用来打开互斥量,即将互斥量加1。成功调用则返回0。InitializeCriticalSection:该函数初始化临界区对象。EnterCriticalSection:该函数用于等待指定临界区对象的所有权。当调用线程被赋予所有权时,该函数返回。LeaveCriticalS

4、ection:该函数释放指定的临界区对象的所有权。3、 测试数据设计及测试结果分析已知测试用例文件输入的文件时:5 thread 1 P 5.000000 thread 2 P 4.000000 thread 3 P 2.000000 thread 4 C 6.000000 5 6 thread 5 P 7.000000 thread 6 P 1.000000 thread 7 C 3.000000 1 3 2 生产者 6 发送生产请求信号.生产者 6 开始在缓冲区 0 生产产品.生产者 6 完成生产过程 :缓冲区【 0 】: 6生成者 3 发送生产请求信号.生产者 3 开始在缓冲区 1 生产

5、产品.生产者 3 完成生产过程 :缓冲区【 1 】: 3消费者 7请求消费 1 产品消费者 7请求消费 1 产品生产者 2 发送生成者请求信号.生产者 2 开始在缓冲区 2 生产产品生产者 2 完成生产过程 :缓冲区【 2 】 : 2生产者 1 发送生产请求信号.生产者 1 开始在缓冲区 3 生产产品.生产者 1 完成生产过程 :缓冲区【 3 】 : 1消费者 7 开始消费 1 产品消费者 7成功消费 1:缓冲区【3】 : -1消费者 7 请求消费 3产品消费者 7开始消费 3产品消费者 7 成功消费 3:缓冲区【1】: -1消费者 7 请求消费 2产品消费者 7开始消费 2产品消费者 7 成

6、功消费 2:缓冲区【2】: -1消费者 4请求消费 5 产品 生产者 5 发送生产请求信号.生产者 5 开始在缓冲区1生产产品生产者 5 完成生产过程缓冲区【1】: 5消费者 4请求消费 5产品消费者 4 请求消费 5产品缓冲区【1】:-1消费者 4请求消费 6 产品消费者 4 开始消费 6产品消费者 4 成功消费 6:缓冲区【0】 :-1五、参考程序#include#include#include#include#include/定义一些常量;/本程序允许的最大临界区数;#define MAX_BUFFER_NUM 10/秒到毫秒的乘法因子;#define INTE_PER_SEC 1000

7、/本程序允许的生产和消费线程的总数;#define MAX_THREAD_NUM 64/定义一个结构,记录在测试文件中指定的每一个线程的参数struct ThreadInfo int serial; /线程序列号 char entity; /是P还是C double delay; /线程延迟 int thread_requestMAX_THREAD_NUM; /线程请求队列 int n_request; /请求个数;/全局变量的定义/临界区对象的声明,用于管理缓冲区的互斥访问;CRITICAL_SECTION PC_CriticalMAX_BUFFER_NUM; int Buffer_Crit

8、icalMAX_BUFFER_NUM; /缓冲区声明,用于存放产品;HANDLE h_ThreadMAX_THREAD_NUM; /用于存储每个线程句柄的数组;ThreadInfo Thread_InfoMAX_THREAD_NUM; /线程信息数组;HANDLE empty_semaphore; /一个信号量;HANDLE h_mutex; /一个互斥量;DWORD n_Thread = 0; /实际的线程的数目;DWORD n_Buffer_or_Critical; /实际的缓冲区或者临界区的数目;HANDLE h_SemaphoreMAX_THREAD_NUM; /生产者允许消费者开始消

9、费的信号量;/生产消费及辅助函数的声明void Produce(void *p);void Consume(void *p); bool IfInOtherRequest(int);int FindProducePositon();int FindBufferPosition(int);int main(void) /声明所需变量; DWORD wait_for_all; ifstream inFile; /初始化缓冲区; for(int i=0;i MAX_BUFFER_NUM;i+) Buffer_Criticali = -1; /初始化每个线程的请求队列; for(int j=0;jMA

10、X_THREAD_NUM;j+) for(int k=0;kMAX_THREAD_NUM;k+) Thread_Infoj.thread_requestk = -1; Thread_Infoj.n_request = 0; /初始化临界区; for(i =0;i n_Buffer_or_Critical; inFile.get(); printf(输入文件是:n); /回显获得的缓冲区的数目信息; printf(%d n,(int) n_Buffer_or_Critical); /提取每个线程的信息到相应数据结构中; while(inFile) inFile Thread_Infon_Thre

11、ad.serial; inFile Thread_Infon_Thread.entity; inFile Thread_Infon_Thread.delay; char c; inFile.get(c); while(c!=n& !inFile.eof() inFile Thread_Infon_Thread.thread_requestThread_Infon_Thread.n_request+; inFile.get(c); n_Thread+; /回显获得的线程信息,便于确认正确性; for(j=0;j(int) n_Thread;j+) int Temp_serial = Thread

12、_Infoj.serial; char Temp_entity = Thread_Infoj.entity; double Temp_delay = Thread_Infoj.delay; printf( n thread%2d %c %f ,Temp_serial,Temp_entity,Temp_delay); int Temp_request = Thread_Infoj.n_request; for(int k=0;kTemp_request;k+) printf( %d , Thread_Infoj.thread_requestk); coutendl; printf(nn); /创

13、建在模拟过程中几个必要的信号量 empty_semaphore=CreateSemaphore(NULL,n_Buffer_or_Critical,n_Buffer_or_Critical, semaphore_for_empty); h_mutex = CreateMutex(NULL,FALSE,mutex_for_update); /下面这个循环用线程的ID号来为相应生产线程的产品读写时所 /使用的同步信号量命名; for(j=0;j(int)n_Thread;j+) std:string lp =semaphore_for_produce_; int temp =j; while(temp) char c = (char)(temp%10); lp+=c; temp/=10; h_Semaphorej+1=CreateSemaphore(NULL,0,n_Thread,lp.c_str(); /创建生产者和消费者线程; for(i =0;i (int) n_Thread;i+) if(Thread_Infoi.entity =P) h_Threadi= CreateThre

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1