代码实现

如题,使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型。本来是想只用信号量实现生产者消费者模型的,但是发现 只能在一个生产者和一个消费者之间,要在多个生产者和消费者模型必须和mutex互斥锁搭配使用才行,sem信号量只是控制并发数的。采用数组模拟产品区,代码中有一定的注释。需要Linux下线程相关知识进行支撑,这里不细说,直接看实现代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <error.h>
#include <sys/errno.h>
#include <pthread.h>
#include <semaphore.h>
#define NUM 10 //产品区容量
int queue[NUM] = {0};//数组模拟产品区,生产者消费者运行模拟环形队列进行生产和消费
sem_t producer,customer;//信号量
int pro_i = 0;//生产者线程 访问下标
int cus_i = 0;//消费者线程 访问下标
pthread_mutex_t pro_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t cus_lock = PTHREAD_MUTEX_INITIALIZER;//生产者
void* produce(void* arg)
{int tmp;//生产从下标 0 -> Nwhile(1){sem_wait(&producer); //producer-- ,直到为0 产品区被填满 进行阻塞//并行的生产者线程生成产品pthread_mutex_lock(&pro_lock);  tmp = queue[pro_i] = rand()%1000 ;pro_i = (pro_i+1)%NUM;pthread_mutex_unlock(&pro_lock);printf("%dth ###producer###:%d\n",(int)arg,tmp);sem_post(&customer);//customer++sleep(rand()%2);}return NULL;
}
//消费者
void* custome(void* arg)
{int tmp;//消费从下标0 -> N while(1){sem_wait(&customer); // customer-- ,直到为0 产品区为空 进行阻塞//并行的消费者线程访问消费产品pthread_mutex_lock(&cus_lock);tmp = queue[cus_i];queue[cus_i] = 0 ;cus_i = (cus_i+1)%NUM;pthread_mutex_unlock(&cus_lock);printf("%dth ***customer***:%d\n",(int)arg,tmp);sem_post(&producer);//producer++ sleep(rand()%2);}return NULL;
}
//使用信号量 实现生产者消费者模型
int main(int argc,char* argv[])
{srand((unsigned int)time(NULL));//设置线程分离pthread_attr_t attr;pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);pthread_t pro[3],cus[5]; int i;//初始化信号量 起初产品区为空sem_init(&producer,0,NUM);//生产者 起初信号量为 NUM 产品区为空生产产品,当信号量为0 也就是产品满 阻塞等待消费者消费产品sem_init(&customer,0,0);  //消费者 起初信号量为 0 阻塞等待生产者生产产品for( i= 0; i< 3;i++ ){pthread_create(&pro[i],&attr,produce,(void*)i);}for( i= 0; i< 5;i++ ){pthread_create(&cus[i],&attr,custome,(void*)i);}//销毁 信号量sem_destroy(&producer);sem_destroy(&customer);//销毁 锁pthread_mutex_destroy(&pro_lock);pthread_mutex_destroy(&cus_lock);//主线程退出pthread_exit(NULL);return 0;
}

实现效果

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

  1. Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)

    同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...

  2. Linux系统编程:IPC信号量

    文章内容 1. 信号量 2. 函数 2.1 命名信号量 / 基于文件 2.2 匿名信号量 / 基于内存 3. 读写锁 信号量:用于解决数据竞争,如同火车道上的信号灯,用来管理共享火车道(共享内存) 1 ...

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

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

  4. 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)

    文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...

  5. Linux系统编程 复习笔记

    4 文件IO 操作 #include<fcntl.h> #include<unistd.h>#include<sys/types.h> creat int fd=c ...

  6. Linux系统编程笔记

    文章目录 1.Linux系统编程 2.文件IO 2.1 文件描述符 2.2 open 2.3 perror 2.4 close 2.5 write 2.6 read 2.7 remove 2.8 系统 ...

  7. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  8. linux线程并不真正并行,Linux系统编程学习札记(十二)线程1

    Linux系统编程学习笔记(十二)线程1 线程1: 线程和进程类似,但是线程之间能够共享更多的信息.一个进程中的所有线程可以共享进程文件描述符和内存. 有了多线程控制,我们可以把我们的程序设计成为在一 ...

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

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

最新文章

  1. nginx访问日志,错误日志参数说明
  2. 架构师之路 — 数据库设计 — 关系型数据库的外键约束与关联
  3. maven 通用pom.xml
  4. spoj16935 Straight Line Spiral Pattern (Act 3)
  5. asp.net MVC3 无法打开项目文件“E:\我们的项目\Project\HeatingMIS.Web\HeatingMIS.Web.csproj”。此安装不支持该项目类型。...
  6. java模糊查询比对方法_Java多条件和模糊查询
  7. HDU 6579 Operation (前缀线性基模板题)
  8. DateTimeFormatInfo 类
  9. 面试题系列-redis连环11问
  10. 音视频开发(10)---nginx-rtmp视频流服务器搭建
  11. window下Oracle 11G安装文档
  12. php把字符串改成utf8,PHP将字符串改成UTF8的方法
  13. 当当网Python图书数据分析
  14. 输入身高体重测身材_【测试】你的身材标准吗? 附赠20-39岁成年人身高体重评分标准...
  15. python中的in和out是什么意思
  16. linux不同用户移动文件系统,第三节 linux:文件系统以及文件操作命令
  17. MySQL按拼音首字母排序
  18. EFR32BG22性能
  19. 互联网产业中“外行领到内行”和软件工程
  20. c语言的实训报告,C语言实训报告.doc

热门文章

  1. 简单英文题 25 Sequence Search(python)
  2. 1.7 编程基础之字符串 32 行程长度编码 python
  3. css中如何实现帧布局_?如何在Python中加入多个数据帧?
  4. 电商扣减库存_电商平台仓库管理系统究竟有何功能?
  5. 二维粗糙海面matlab,三维随机粗糙海面的Monte-Carlo仿真
  6. 大学生动漫网页设计模板 机动战士高达静态网页制作成品下载 HTML漫画网页作业带JS轮播图
  7. java初始化数据报_java – 如何在Docker中初始化数据库后启动flyway
  8. python初学者怎么找工作_学python找工作好找吗
  9. python3萌新入门笔记_我的Python3萌新入门笔记
  10. Qt笔记-获取Windows下目前运行的进程信息