posix下定义了一个semaphore,他和systemV版本下的sem很像,而这个多用于线程,它的单位是信号量,而sem的单位是信号量集。

 #include <semaphore.h>int sem_init(sem_t *sem, int pshared, unsigned int value);int sem_destroy(sem_t *sem);int sem_wait(sem_t *sem);int sem_trywait(sem_t *sem);int sem_post(sem_t *sem);

其中wait就是P操作,post则是V操作。

环形BUFF的设计思想:

用一个大小为BUFF_MAX的数组,生产者在前,消费者在后,生产者的pro_sem初始化BUFF_MAX,

消费者cons_sem初始化为0,生产者生产则pro_sem执行p操作cons_sem执行V操作,反之消费者消费cons_sem-1,而pro_sem+1,数组下表%BUFF_MAX这样数组就相当于一个环形BUUF了。

  1 #include<stdio.h>2 #include<semaphore.h>3 #include<pthread.h>4 #define PRO_BUFF 205 #define CONS_BUFF 06 int my_buff[PRO_BUFF];7 sem_t productor_sem;8 sem_t consumer_sem;9 sem_t cons_comm;10 sem_t pro_comm;11 12 void*productor(void *arg)13 {14     pthread_detach(pthread_self());15     int p=0;16     while(1)17     {18         sem_wait(&productor_sem);19         sem_wait(&pro_comm);20         int value=rand()%100;21         my_buff[p]=value;22         printf("productor%dalready :%d\n",(int)arg,value);23         sem_post(&pro_comm);24         sem_post(&consumer_sem);25         p=(p+1)%PRO_BUFF;26         sleep(rand()%3);27     }28 }29 void*consumer(void *arg)30 {31     pthread_detach(pthread_self());32     int c=0;33     while(1)34     {35         sem_wait(&consumer_sem);36         sem_wait(&cons_comm);37         int value=my_buff[c];38         printf("consumer%dreceive value :%d\n",(int)arg,value);39         sem_post(&cons_comm);40         sem_post(&productor_sem);41         c=(c+1)%PRO_BUFF;42         sleep(rand()%5);43     }44 45 }46 47 48 int main()49 {50     sem_init(&productor_sem,0,PRO_BUFF);51     sem_init(&consumer_sem,0,CONS_BUFF);52     sem_init(&cons_comm,0,1);53     sem_init(&pro_comm,0,1);54     pthread_t productor1_id;55     pthread_t consumer1_id;56     int i;57     for(i=1;i<4;i++)58     {59         pthread_create(&productor1_id,NULL,productor,(void*)i);60 61     }62     for(i=1;i<4;i++)63     {64         pthread_create(&consumer1_id,NULL,consumer,(void*)i);65     }66     pthread_join(productor1_id,NULL);67     pthread_join(consumer1_id,NULL);68 }

在消费者和消费者之间添加一把锁,生产者生产者之间添加一把锁,目的是为了它们之间的互斥关系。

转载于:https://blog.51cto.com/wpfbcr/1768062

信号量实现环形buff下多生产者多消费者模型相关推荐

  1. Linux系统编程:使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型

    代码实现 如题,使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型.本来是想只用信号量实现生产者消费者模型的,但是发现 只能在一个生产者和一个消费者之间,要在多个生产者和消费者模 ...

  2. 【Linux下】 线程同步 生产者与消费者模型

    文章目录 [Linux下] 线程同步 生产者与消费者模型 线程同步 同步概念与竞态条件 条件变量 条件变量本质 操作条件变量 初始化和销毁条件变量 等待 唤醒 通过条件变量实现的简单线程同步例子 为什 ...

  3. 【Linux】生产者与消费者模型、信号量、死锁

    目录 死锁 死锁的产生场景 死锁的gdb分析 1.通过调试可执行程序来分析 2.通过调试正在运行的程序 死锁的必要条件 死锁的预防 生产者与消费者模型 123规则 应用场景及特点 代码实现: 信号量 ...

  4. Linux系统编程40:多线程之基于环形队列的生产者与消费者模型

    文章目录 (1)什么是信号量 (2)与信号量相关的操作 (3)基于环形队列的生产者与消费者模型-信号量(单消费者单生产者) (1)什么是信号量 前面的叙述中,我们通过锁保证了每次只有一个线程进入临界区 ...

  5. Linux下生产者与消费者模型

    1. 概念   有一个或多个生产者生产某种类型的数据,并放在缓冲区里(生产者),有一个消费者从缓冲区中取数据,每次取一项(消费者).系统保证任何时候只有一个主题可以访问缓存区.所以当生产满时,生产者不 ...

  6. python 进程间同步_python之路29 -- 多进程与进程同步(进程锁、信号量、事件)与进程间的通讯(队列和管道、生产者与消费者模型)与进程池...

    所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了.至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠 ...

  7. linux进程间通信:system V 信号量 生产者和消费者模型编程案例

    生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...

  8. Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)

    条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...

  9. c/c++:线程同步(互斥锁、死锁、读写锁、条件变量、生产者和消费者模型、信号量)

    目录 1. 概念 2. 互斥锁 3. 死锁 4. 读写锁 5. 条件变量 5.1 生产者和消费者模型 6. 信号量 1. 概念 线程同步: > 当有一个线程在对内存进行操作时,其他线程都不可以对 ...

最新文章

  1. vs code php html,vscode如何调试html
  2. VMware Workstations三种网卡模式
  3. JRebel的优势与使用(基于IDEA)
  4. 逻辑判断 java_写 JS 逻辑判断,不要只知道用 if-else 和 switch
  5. 如何美化linux终端输出
  6. HTML5前端知识分享:Vue入门
  7. Java的中排序方式
  8. laravel 先排序后分组怎么写_希尔排序算法拆解解析
  9. 递归法:汉诺塔(快速掌握)
  10. 北航计算机考研录取多少人,北航计算机考研近三年报考录取情况
  11. Excel如何批量将图片插入到批注中
  12. python输出欢迎某某某_python中怎么写注释
  13. chuangkouguanyuwangyeyuan
  14. RGB565 与 RGB888的相互转换
  15. is not eligible for getting processed by all BeanPostProcessors 导致找不到路径报404
  16. 无线降噪耳机哪个品牌好?2021年无线降噪耳机排行榜
  17. 计算机网络思科平台第五章测验答案
  18. 和平发展数字化与传统行业
  19. 发现孩子做作业用计算机,孩子写作业要用手机完成?家庭作业电子化,到底靠谱不靠谱...
  20. Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded

热门文章

  1. 反编译获取线上任何微信小程序源码(转)
  2. Exploit Kit攻击工具包流量锐减96%!这段时间究竟发生了什么?
  3. SQLServer基本操作
  4. 鸟哥Linux服务器-8
  5. 问题二十:C++全局debug “ray tracing图形”实例
  6. 6-2 是否二叉搜索树 (25 分)
  7. 59. 螺旋矩阵 ||
  8. 医疗大数据为何发展如此缓慢
  9. 通俗易懂的monteCarlo积分方法(八)
  10. pythonrequests查询_Python Requests实例,查询成绩