如何用多线程同步方法解决生产者-消费者问题

 时间:2024-10-12 23:59:43

1、问题描述:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。

2、设置一个长度为20的一维数组buff[20]作为有界缓冲区,缓冲区为0时,代表该缓冲区内没有产品,buff[i]=i+1表示有产品,产品为i+1。

3、设置3个同步信号灯:一个说明空缓冲区的数目,用empty表示,其初值为有界缓冲区的大小20 ;另一个说明满缓冲区(即产品)的数目,用full表示,其初值为0。由于缓冲区是临界资源,必须互斥使用,所以还设置了一个互斥信号灯mutex,其初值为1。用这3个信号灯有效控制多个生产者线程和多个消费者线程的同步准确的运行。

4、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()函数来显示其自身的标识符。

  • Nba2kol 街头赛大C实用技巧
  • 如何使用Depends分析动态库依赖哪些库文件
  • 新世界怎么制作采集工具
  • Safari显示无法打开页面怎么办
  • 小吴博客出品-Windows如何设置MAC的鼠标指针
  • 热门搜索
    关于清明节手抄报图片 六年级手抄报大全 只要妈妈露笑脸手抄报 消防安全手抄报模板 关于读书手抄报资料 小学垃圾分类手抄报 关于父母爱的手抄报 礼仪手抄报图片 手抄报花边简单图案 好人好事手抄报