生产者消费者问题是经典的同步问题,这篇文章用来记录一下如何使用信号量机制解决。

信号量机制(Semaphore)是解决同步问题常用解法,所谓信号量其实就代表着对应共享资源的数量。对于信号量只允许三种操作,分别是初始化、P操作、V操作。P、V操作都是具有原子性的。
P操作会减少信号量的值(假设一次减1),如果信号量成为负数,就代表着资源不够,调用线程会进入该信号量的等待队列,变为阻塞状态。
V操作会增加信号量的值(假设一次加1),并唤醒处于等待队列头部的线程。

信号量机制用法灵活,既可以用来实现互斥,也可以实现“线程一前一后执行”的同步关系。
下面讨论如何解决生产者消费者问题。

生产者消费者问题:多个生产者向产品队列中投放产品,多个消费者从产品队列中取出产品

分析该问题中存在的同步关系:
1.产品队列在同一时刻应该只能被一个线程访问,这是显而易见的。这里存在一个互斥关系,可以设置一个信号量mutex,且初始值为1(初值为1,且只允许在0,1之间变动,可实现线程互斥)
2.当产品队列中空位为0时,生产者不应该继续往队列中投放产品,应该等待消费者取出产品制造空位后,才能继续生产。这里存在“线程间一前一后执行”的同步关系,设置一个信号量empty,生产者每次生产之前需要对empty执行一次P操作,消费者每次消费之后对empty执行一次V操作。
3.当产品队列中产品数为0时,消费者不应该继续从队列中取出产品,应该等待生产者投放产品后,才能继续消费。这里存在“线程间一前一后执行”的同步关系,设置一个信号量filled,消费者每次消费之前需要对filled执行一次P操作,生产者每次生产之后对filled执行一次V操作。

下面为伪代码:

Product products[5]; //容量为5的产品队列
Semaphore mutex = 1; //用以实现互斥访问产品队列的信号量
Semaphore empty = 5; //初始时空位为5
Semaphore filled = 0; //初始时产品数为0//生产者
void produce(){while (true) {...P(empty); P(mutex);////向产品队列投放产品//V(mutex);V(filled);...}
}//消费者
void consumer(){while (true) {...P(filled); P(mutex);////向产品队列投放产品//V(mutex);V(empty);...}
}

使用信号量机制解决生产者消费者问题相关推荐

  1. 操作系统课设--使用信号量解决生产者/消费者同步问题

    山东大学操作系统课设lab3 实验三 使用信号量解决生产者/消费者同步问题(lab3) 实验目的 理解Nachos的信号量是如何实现的 生产者/消费者问题是如何用信号量实现的 在Nachos中是如何创 ...

  2. java信号量生产者_java信号量PV操作 解决生产者-消费者问题

    package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...

  3. 用管程解决生产者消费者问题

    生产者消费者问题 系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用. 生产者,消费者共享一个初始化为空,大小为n 的缓冲区. 如 ...

  4. Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题

    前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用  http://www.cnblogs.com/ngnetboy/p/3521547.htm ...

  5. 两种方式解决 生产者消费者问题

    一.通过wait().notify()线程通信来实现 输出结果: 二.通过阻塞队列来解决生产者消费者问题 输出结果: 由输出结果可以看出:"最后阻塞队列中还剩下4个鸡蛋"明显是正确 ...

  6. JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)

    package test; /** * Synchronized 版本解决生产者消费者 * wait() / notify()方法 */ import java.util.LinkedList; im ...

  7. 用 wait-notify 写一段代码来解决生产者-消费者问题

    用 wait-notify 写一段代码来解决生产者-消费者问题 参考文章: (1)用 wait-notify 写一段代码来解决生产者-消费者问题 (2)https://www.cnblogs.com/ ...

  8. C语言使用信号量解决生产者消费者模型的同步问题

    友链 gcc 1.c -o 1 -lpthread // ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 通过内存拷贝将第一个文件的内存映射 ...

  9. Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

    Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...

最新文章

  1. 使用 Acegi 保护 Java 应用程序
  2. 程序集强命名与GAC
  3. codeforces gym-101741 Cover the Paths LCA、离线询问
  4. 30个基于jQuery的日期时间选择插件
  5. Java 8: LocalDate、LocalTime 、LocalDateTime 处理日期时间
  6. 小程序 ajax 加载,小程序实战-小程序网络请求异步加载
  7. 解决循环引用--弱引用weak_ptr
  8. 一男子安装lua开发环境傻逼操作,惊呆所有人
  9. 商城前后端原型、商城prd文档、商城后台管理系统、商城app文档、电商需求文档、限时秒杀、电商平台、促销助力、拼团抽奖、电商文档、prd文档、电商前后端原型、电商原型、Axure电商系统、rp原型
  10. 笔记︱虚拟变量回归=差异显著(方差分析)+差异量化(系数值)
  11. 联系人字段中增加生日字段
  12. python实现自动打电话软件_用Python实现的Internet电话软件(P2P-SIP)开源
  13. Openwrt安装transmission离线下载
  14. 计算机三级考点2:管理和运营宽带城域网的关键技术
  15. Android 平台 Native 代码的崩溃捕获机制及实现
  16. c++ reinterpret_cast报错: casts away qualifiers
  17. [计算机通信网络]Packet tracer中laptop连接无线路由器
  18. 蒂芙尼推出由碧昂丝和Jay-Z主演的最新广告宣传片
  19. VUE3学习笔记(细节)
  20. ServletConfig FilterConfig作用

热门文章

  1. Windchill二次开发-自定义文件编号(2)
  2. Java判断平年闰年
  3. 使用Java代码生成RSA公私钥的.pem文件
  4. 算法入门 17.Floyd算法
  5. gp数据库创建数据库_创建数据库简介
  6. 经验模态分解和各种进化及变种 EMD,EEMD,CEEMD,CEEMDAN,ESMD等简要介绍
  7. 工程监测仪器多通道振弦模拟信号采集仪VTN的用户接口
  8. MySQL记录删除后竟能按中间被删除的主键加回去,磁盘空间被重用!——底层揭秘MySQL行格式记录头信息
  9. 【自然语言处理与文本分析】文本特征提取方法总结。关键词提取方法。公认效果较好的IDF,RCF。
  10. redis集群搭建参考文档