欢迎来到天天文库
浏览记录
ID:27589735
大小:937.49 KB
页数:24页
时间:2018-12-03
《linux下实现多线程的生产者消费者问题》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Linux下实现多线程的生产者消费者问题一、原理的理解生产者-消费者问题是一个经典的线程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号S机制。在同一个线程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消赀者线程消赀。消赀者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程牛产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品吋,如果没奋满的缓冲区,那么消费者线程将被肌塞,直到新的物品被生产出来。多个生产
2、/消费者在冇界缓冲上操作。它利用N个字节的共享内存作为冇界循环缓冲区,利用写一字符模拟放一个产品,利用读一字符模拟消费一个产品。当缓冲区空时消费#应阻塞睡眠,而当缓冲区满时生产者应当阻塞睡眠。一旦缓冲区中有空单元,生产者线程就向空单元中入写字符,并报告写的内容和位置。一旦缓冲区中有未读过的字符,消费者线程就从该单元屮读出字符,并报告读取位置。生产者不能昀同一单元屮连续写两次以上相同的字符,消费者也不能从同一单元中连续读两次以上相同的字符。二、完成步骤1、思路分析本作、Ik是完善课件上的线程综合实例的练习生
3、产者-消费者问题,柬构这个程序的框架,完成性能分析,使之进一步理解掌握Linux卜'线程的同步、通信以及豆斥和多线程的安全问题。一般情况下,解决互斥方法常用信号S和互斥锁,即semaphore和nwtex,而解决这个问题,多采用一个类似资源槽的结构,每个槽位标示了指向资源的指针以及该槽位的状态,生产者和消费者互斥查询资源槽,判断是否有产品或者有空位可以屮产,然后根据指针进行相应的操作。M时,为了告诉生产者或者消费者资源槽的情况,还耍有一个消息传送机制,无论是管道还是线程通信。然而,本次试验有儿个特殊的要求
4、:A、循环缓冲。B、除了stderr,std0Ut等外,只用小于2个的互斥锁、C、放弃资源槽分配机制,采川额外的数据结构。D、生产者一直持续生产,形成生产消费的良性循环。首先,使用一个互斥锁,意味着资源槽机制就不能使用了。因为资源槽虽以用一个互斥锁完成,但是需要有额外的通信,如果使用管道通信,则管道也必须是互斥,这就不满足1个互斥锁的要求。其次,要求生产者一直生产,这就否定了另外一种方法:消费者、生产者的位®均平等,消费者消费的吋候生产者不能生产,生产者生产的吋候消费者不能消费。因此,就需要采用A要求,也
5、就是循环链表的形忒。为了保证互斥要求,需要定义一个数裾结构,这个数据结构包含两个指针,一个读一个写,同时有一个资源数目量,告诉生产者和消费者是否可以生产或者消费。由于该数据结构很小,因而可以对此结构互斥访问。同吋,对于每组数据,都有一个标志位,表示此组数据是否被占用,生产者和消费者均讨以先占用此位置然后完成相应的操作。当消费者互斥访问此结构时,首先判断是否有数裾可以取,如果没杏,直接等待,若侖数据可取,先更改标志位占川此数据,并将资源数0-1。然后交出互斥,把数据拷W到tl己缓冲区内,清空数据。当生产者访
6、问吋,首先判断有没有空位可以生产,如果没有,直接等待,若冇数据可以生产,先判断该位是否被占用,如果没被占用,则占用此位置进行生产生产完成后,将占用位改为未占用,同吋将资源数H+1。这个过程可以如图所示:读指针写指针、资源数目数据块数据块数据块数据块占用位占用位>曬醐>占用位数据块数据块数据块数据块占用位<儀議難:<占用位<占用位2、重要函数和数据结构(1)数据结构#defineN5//生产者的数目^defineN215//消费者数H^defineM20//缓冲数目^definedebug0//调试模式#d
7、efinenowait1//是否添加额外等付:pthread_mutex_tmutex;//斥信■景intprod_id=0;//生产者idintprocid=0;//消货各id//成功以及失败次数计数intSucc[N+N2];intFail[N+N2];//用于生产的填充数据chardt[30]="aaaaaaaaaabbbbbbbbbbcccccccccc";inttoexit=0;//退出标记//共用数裾区structdatastruc{intOccupied;//该位S妃否被占川无论牛.产还处消
8、费chard[1024]://数1Kstructdata_struc*nx;//下——个指针};//互斥最structmtx{structdata_struc*rd_p;structdata_struc氺wr_p;intcnt;//产品数量};structmtx氺niymutex;(2)函数说明voidprintinfoO;//凋试函数,打印公用数裾区的内容和状态voidCreate_Empty_DS();//初始化循环链表v
此文档下载收益归作者所有