您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 用多线程同步方法解决生产者-消费者问题
目录1.需求分析..............................................................................................................................11.1课程设计题目..............................................................................................................11.2课程设计任务..............................................................................................................11.3课程设计原理..............................................................................................................11.4课程设计要求..............................................................................................................11.5实验环境.......................................................................................................................12.概要设计.............................................................................................................................22.1课程设计方案概述.....................................................................................................22.2课程设计流程图..........................................................................................................23.详细设计................................................................................................................................33.1主程序模块...................................................................................................................33.2生产者程序模块.......................................................................................................43.3消费者程序模块..........................................................................................................54.调试中遇到的问题及解决方案................................................................................55.运行结果................................................................................................................................66.实验小结................................................................................................................................7参考文献.....................................................................................................................................7附录:源程序清单................................................................................................................7武汉理工大学华夏学院《操作系统原理》课程设计报告11.需求分析1.1课程设计题目用多线程同步方法解决生产者-消费者问题1.2课程设计任务(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者线程的标识符。(2)生产者和消费者各有两个以上。(3)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。1.3课程设计原理生产者和消费者问题是从操作系统中的许多实际同步问题中抽象出来的具有代表性的问题,它反映了操作系统中典型的同步例子,生产者进程(进程由多个线程组成)生产信息,消费者进程使用信息,由于生产者和消费者彼此独立,且运行速度不确定,所以很可能出现生产者已产生了信息而消费者却没有来得及接受信息这种情况。为此,需要引入由一个或者若干个存储单元组成的临时存储区(即缓冲区),以便存放生产者所产生的信息,解决平滑进程间由于速度不确定所带来的问题。1.4课程设计要求(1)有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1~20这20个整型数。(2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者线程的标识符。(3)生产者和消费者各有两个以上。(4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。1.5实验环境系统平台:LINUX开发语言:C开发工具:PC机一台武汉理工大学华夏学院《操作系统原理》课程设计报告22.概要设计2.1课程设计方案概述本设计中设置一个长度为20的一维数组buff[20]作为有界缓冲区,缓冲区为0时,代表该缓冲区内没有产品,buff[i]=i+1表示有产品,产品为i+1。设置3个同步信号灯:一个说明空缓冲区的数目,用empty表示,其初值为有界缓冲区的大小20;另一个说明满缓冲区(即产品)的数目,用full表示,其初值为0。由于缓冲区是临界资源,必须互斥使用,所以还设置了一个互斥信号灯mutex,其初值为1。用这3个信号灯有效控制多个生产者线程和多个消费者线程的同步准确的运行。Main()函数中调用函数sem_init()对信号灯进行初始化;利用for语句循环创建5个producer(生产者)分离线程和5个consumer(消费者)分离线程;Producer线程通过调用函数sem_wait(&empty)判断是否有空缓冲区。若无,则阻塞当前线程,若有则调用函数sem_wait(&mutex)等待对临界资源的操作权,当mntex为1时,便获得临界资源的操作权,可将产品放入缓冲区,及时输出缓冲区里的内容。然后依次调用函数sem_post(&mutex)和sem_post(&full)来释放缓冲区操作权和增加满缓冲区信号量的值;Consumer线程通过调用函数sem_wait(&full)判断是否有满缓冲区。若无,则阻塞当前线程,若有则调用函数sem_wait(&mutex)等待对临界资源的操作权,当mntex为1时,便获得临界资源的操作权,可从满缓冲区中取出产品消费,并及时输出缓冲区里的内容。然后依次调用函数sem_post(&mutex)和sem_post(&emptyl)来释放缓冲区操作权和增加空满缓冲区信号量的值。Producer和Consumer线程中均用缓冲区指针b指出当前是对哪一个缓冲区进行放入/取出操作;并调用pthread_self()函数来显示其自身的标识符。2.2课程设计流程图设计中主要有三个模块,首先从主程序中进入,完成初始化及创建好生产者和消费者线程后,进入生产者或消费者模块,具体流程见程序设计流程图如图1所示:武汉理工大学华夏学院《操作系统原理》课程设计报告3图1程序设计流程图3.详细设计3.1主程序模块主程序中利用函数sem_init()对信号灯进行初始化;利用for语句循环创建3个producer(生产者)分离线程和3个consumer(消费者)分离线程,程序段如下:intmain(void)开始初始化创建生产者线程和消费者线程生产者消费者生产empty的P操作Buff满mutex的P操作暂停mutex的V操作full的V操作否是Buff空否full的P操作mutex的P操作消费mutex的V操作Empty的V操作暂停是武汉理工大学华夏学院《操作系统原理》课程设计报告4{inti;initbuff();for(i=0;i5;i++){pthread_create(&id1[i],NULL,(void*)producer,(&i));}//创建生产者线程for(i=0;i5;i++){pthread_create(&id2[i],NULL,(void*)consumer,(&i));}//创建消费者线程for(i=0;i5;i++){pthread_join(id1[i],NULL);pthread_join(id2[i],NULL);}exit(0);}//等待生产者线程,消费者线程,结束主线程3.2生产者程序模块Producer线程通过调用函数sem_wait(&empty)判断是否有空缓冲区。若无,则阻塞当前线程,若有则调用函数sem_wait(&mutex)等待对临界资源的操作权,当mntex为1时,便获得临界资源的操作权,可将产品放入缓冲区,及时输出缓冲区里的内容;并用指针b指出当前是对哪一个缓冲区进行放入/取出操作,且调用pthread_self()函数来显示其自身的标识符。然后依次调用函数sem_post(&mutex)和sem_post(&full)来释放缓冲区操作权和增加满缓冲区信号量的值,程序段如下:voidproducer()//生产者{intpid=0;intj,k;pid=pthread_self();//获得生产者标识符while(1){for(j=0;j5;j++){if(pid==id1[j]){k=j+1;}}sem_wait(&empty);//P操作,判断缓冲区是否有空位置sem_wait(&mutex);//P操作,获得对临界资源的操作权if(p%21!=0){buff[b]=p%21;printf(producer%dproduce:%d\n,k,p%21);printbuff();b++;p++;}elsep++;sem_post(&mutex);//V操作,释放临界资源武汉理工大学华夏学院《操作系统原理》课程设计报告5sem_post(&full);//V操作,满缓冲区信号灯加1sleep(4);}}3.3消费者程序模块Consumer线程调用调用函数sem_wait(&full)判断是否有满缓冲区。若无,则阻塞当前线程,若有则调用函数sem_
本文标题:用多线程同步方法解决生产者-消费者问题
链接地址:https://www.777doc.com/doc-7290419 .html