The structure of the producer process do { // 生产产品 wait (empty); wait (mutex); // 往Buffer中放入产品 signal (mutex); signal (full); } while (true); The structure of the consumer process do { wait (full); wait (mutex); // 从Buffer中取出产品 signal (mutex); signal (empty); // 消费产品 } while (true); 3 开发环境与工具 系统平台:Windows环境 实现语言:C++语言 开发工具:Vs2012 4 概要设计 4.1 数据结构设计 通过分析课程设计要求,具体设计出如下数据结构: 1. int buffer[20]={0};//定义缓冲区空间大小 2.包含数据结构pthread_t 它记录一个线程的号,主要包括下面几个函数,完成不同的功能: ThreadHandle[0]=CreateThread(NULL,0,Producer,NULL,0,&producer1); //创建一个线程。 ExitThread(0); CloseHandle(ThreadHandle[0]); //等待一个线程结束。 4.2 程序模块实现 4.2.1 生产者(Producer)模块 生产者线程向一缓冲区中写入数据,且写入缓冲区的数目不能超过缓冲区容量。当生产者产生出数据,需要将其存入缓冲区之前,首先检查缓冲区中是否有“空”存储单元,若缓冲区存储单元全部用完,则生产者必须阻塞等待,直到消费者取走一个存储单元的数据,唤醒它。若缓冲区内有“空”存储单元,生产者需要判断此时是否有别的生产者或消费者正在使用缓冲区,若是有,则阻塞等待,否则,获得缓冲区的使用权,将数据存入缓冲区,释放缓冲区的使用权,其流程图如图2所示: 生产一条数据No是否可用存储单元等待资源,阻塞Yes被唤醒No是否可用Yes存入一条数据等待使用权,阻塞被唤醒归还使用权数据单元加1,唤醒消费者 图
2 生产者流程图
//生产者线程 DWORD WINAPI Producer(LPVOID lpPara) { do{ WaitForSingleObject(empty,INFINITE); 冲区减1 WaitForSingleObject(mutex,INFINITE); 上锁 //空缓//信号量 buffer[in]=in+1; //往Buffer中放入产品 in=(in+1)%BUFFER_SIZE; //放入指针调整,为下次送出做准备 printAll(); ReleaseMutex(mutex); //信号量解锁 ReleaseSemaphore(full,1,NULL); //满缓冲区加1,即当公共资源增加时,调用函数ReleaseSemaphore()增加信号量 }while(1); }
4.2.2 消费者(Consumer)模块 消费者线程从缓冲区中读取数据,且消费者读取的数目不能超过生产者写入的数目。消费者取数据之前,首先检查缓冲区中是否存在装有数据的存储单元,若缓冲区为“空”,则阻塞等待,否则,判断缓冲区是否正在被使用,若正被使用,若正被使用,则阻塞等待,否则,获得缓冲区的使用权,进入缓冲区取数据,释放缓冲区的使用权。其执行流程如图3所示:
No是否可用存储单元等待资源,阻塞Yes被唤醒是否可用No等待使用权,阻塞Yes被唤醒取出一条数据归还使用权空缓冲区加1,唤醒一个生产者消费数据 图3 消费者流程图 //消费者线程 DWORD WINAPI Consumer(LPVOID lpPara) { do{ WaitForSingleObject(full,INFINITE); 区减1 WaitForSingleObject(mutex,INFINITE); 量上锁 //满缓冲 //信号
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新工程科技操作系统课程设计 - - 用多线程同步方法解决生产者 (2)全文阅读和word下载服务。
相关推荐: