信号量实现环形buff下多生产者多消费者模型
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下多生产者多消费者模型相关推荐
- Linux系统编程:使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型
代码实现 如题,使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型.本来是想只用信号量实现生产者消费者模型的,但是发现 只能在一个生产者和一个消费者之间,要在多个生产者和消费者模 ...
- 【Linux下】 线程同步 生产者与消费者模型
文章目录 [Linux下] 线程同步 生产者与消费者模型 线程同步 同步概念与竞态条件 条件变量 条件变量本质 操作条件变量 初始化和销毁条件变量 等待 唤醒 通过条件变量实现的简单线程同步例子 为什 ...
- 【Linux】生产者与消费者模型、信号量、死锁
目录 死锁 死锁的产生场景 死锁的gdb分析 1.通过调试可执行程序来分析 2.通过调试正在运行的程序 死锁的必要条件 死锁的预防 生产者与消费者模型 123规则 应用场景及特点 代码实现: 信号量 ...
- Linux系统编程40:多线程之基于环形队列的生产者与消费者模型
文章目录 (1)什么是信号量 (2)与信号量相关的操作 (3)基于环形队列的生产者与消费者模型-信号量(单消费者单生产者) (1)什么是信号量 前面的叙述中,我们通过锁保证了每次只有一个线程进入临界区 ...
- Linux下生产者与消费者模型
1. 概念 有一个或多个生产者生产某种类型的数据,并放在缓冲区里(生产者),有一个消费者从缓冲区中取数据,每次取一项(消费者).系统保证任何时候只有一个主题可以访问缓存区.所以当生产满时,生产者不 ...
- python 进程间同步_python之路29 -- 多进程与进程同步(进程锁、信号量、事件)与进程间的通讯(队列和管道、生产者与消费者模型)与进程池...
所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了.至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠 ...
- linux进程间通信:system V 信号量 生产者和消费者模型编程案例
生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...
- Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)
条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...
- c/c++:线程同步(互斥锁、死锁、读写锁、条件变量、生产者和消费者模型、信号量)
目录 1. 概念 2. 互斥锁 3. 死锁 4. 读写锁 5. 条件变量 5.1 生产者和消费者模型 6. 信号量 1. 概念 线程同步: > 当有一个线程在对内存进行操作时,其他线程都不可以对 ...
最新文章
- vs code php html,vscode如何调试html
- VMware Workstations三种网卡模式
- JRebel的优势与使用(基于IDEA)
- 逻辑判断 java_写 JS 逻辑判断,不要只知道用 if-else 和 switch
- 如何美化linux终端输出
- HTML5前端知识分享:Vue入门
- Java的中排序方式
- laravel 先排序后分组怎么写_希尔排序算法拆解解析
- 递归法:汉诺塔(快速掌握)
- 北航计算机考研录取多少人,北航计算机考研近三年报考录取情况
- Excel如何批量将图片插入到批注中
- python输出欢迎某某某_python中怎么写注释
- chuangkouguanyuwangyeyuan
- RGB565 与 RGB888的相互转换
- is not eligible for getting processed by all BeanPostProcessors 导致找不到路径报404
- 无线降噪耳机哪个品牌好?2021年无线降噪耳机排行榜
- 计算机网络思科平台第五章测验答案
- 和平发展数字化与传统行业
- 发现孩子做作业用计算机,孩子写作业要用手机完成?家庭作业电子化,到底靠谱不靠谱...
- Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
热门文章
- 反编译获取线上任何微信小程序源码(转)
- Exploit Kit攻击工具包流量锐减96%!这段时间究竟发生了什么?
- SQLServer基本操作
- 鸟哥Linux服务器-8
- 问题二十:C++全局debug “ray tracing图形”实例
- 6-2 是否二叉搜索树 (25 分)
- 59. 螺旋矩阵 ||
- 医疗大数据为何发展如此缓慢
- 通俗易懂的monteCarlo积分方法(八)
- pythonrequests查询_Python Requests实例,查询成绩