一、信号量的缺点

信号量的使用一定要小心,如下图中解决生产者-消费者问题的程序:

如果在producer的执行函数中,将empty与mutex的down操作互换,如果此时mutex为0,将首先对mutex进行down操作,进程陷入阻塞,而同时,当consumer的执行函数执行到down(&mutex)的时候,由于mutex为0,因此,consumer线程也将进入阻塞,两个进程都将永远进入阻塞状态,这被称为“死锁”

这说明使用信号量时一定要非常小心,一处很小的错误将有可能导致很大的麻烦,因为竞争条件、死锁以及其他一些问题都是不可预测和不可再现的行为

为了更易于编写正确的程序,一种高级同步原语 -- 管程(monitor)诞生了

二、管程

一个管程是一个由过程、变量及数据结构等组成的一个集合,它们组成一个特殊的模块或软件包。

管程内部的共享变量

管程内部的条件变量

管程内部并行执行的进程

对局部于管程内部的共享数据设置初始值的语句

进程可以在任何需要的时候调用管程中的过程,但是他们不能在管程之外声明的过程中直接访问管程内的数据结构

但是,需要注意的是管程是语言概念,而C语言并不支持它

任意时刻,管程中只能有一个活跃的进程,这一特性是的管程能够有效地完成互斥,由编译器选择采取与其他过程调用不同的方法来处理对管程的调用

典型的处理方法是,当一个进程调用管程过程时,该过程中的前几条指令将检查在管程中是否有其他的活跃进程,如果有,调用进程将被挂起,知道另一个进程离开管程将其唤醒,如果没有,则该调用进程可以进入

进入管程时的互斥由编译器负责,但通常的做法是用一个互斥量或二元信号量,因为是有编译器而非程序员来安排互斥,所以出错的可能性要小得多

在任何一个时刻,写管程的人无需关心编译器是如何实现互斥的,他只需要知道将所有的临界区转换成管程过程即可,绝不会有两个进程同时执行临界区中的代码。

三、管程中的条件变量

管程提供了一种实现互斥的渐变途径,但是我们还需要一种办法使得进程在无法继续运行时被阻塞,解决这个问题的方法就是引入条件变量,以及相关的两个操作:wait和signal,当一个管程过程发现他无法继续运行时(如生产者发现缓冲区已满),他会在某个条件变量上(如full)上执行wait操作,该操作导致调用进程自身阻塞,并将另一个等在管程外的进程调入管程,同时,一个进程也可以通过对伙伴正在等待的一个条件变量执行signal操作完成唤醒正在睡眠的伙伴进程,但是这个时候就有可能会出现两个活跃进程同时处在管程中的情况,这个情况有两种方案可以解决:

运行新唤醒的进程,挂起之前的进程

执行signal的进程立即退出管程,即规定signal只能作为管程过程的最后一条语句

让发信者继续运行直到发信者退出管程后才让被唤醒的进程运行

很明显,第一种方案更加简单,所以一般我们采取这一方案

注意,条件变量与信号量不同,他并不是计数器,如果向一个条件变量发送信号,而这个条件变量上此时并没有等待进程,则这个信号就会丢失,也就是说wait必须在signal之前执行

wait、signal与sleep、wakeup最大的区别是他们不存在严重的竞争条件,因为可能存在一种情况,即当一个进程正要去sleep而实际还没有sleep的时候,另一个进程企图唤醒他,从而造成了wakeup信号的丢失,而管程中不会存在这样的问题,因为在缓冲区满,生产者wait前,消费者进程根本不可能进入管程

四、代码示例

如图所示,是用管程实现生产者-消费者问题揭发框架的一个类似于pascal的伪代码

java支持用户级进程,只要将关键词synchronized加入到方法声明中,java就保证这个方法一旦被某个进程执行,就不允许其他进程执行它,因此我们可以通过这一特性实现管程的编程

这个例子其实并不难懂,由于有synchronized关键字,所以无论是producer要进行的insert方法还是consumer要进行的remove方法都只能让一个进程进入,因此他们不需要再担心竞争条件

java中并没有条件变量,反之,java提供了两个过程:wait和notify,与sleep和wakeup等价,但他们并不受竞争条件约束,而是通过异常机制实现对中断情况的处理

c语言管程例子,管程相关推荐

  1. c语言管程例子,管程 - it610.com

    一.信号量的缺点 信号量的使用一定要小心,如下图中解决生产者-消费者问题的程序: 如果在producer的执行函数中,将empty与mutex的down操作互换,如果此时mutex为0,将首先对mut ...

  2. 携程python_Python 携程

    一.协程 1.又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程(相当于操作系统不知道它的存在,是用户控制的). 2.协程拥有自己的寄存器上下文和栈(代码的 ...

  3. Kotlin学习笔记26 协程part6 协程与线程的关系 Dispatchers.Unconfined 协程调试 协程上下文切换 Job详解 父子协程的关系

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 协程与线程的关系 import kotlinx.coroutines.* import java.util.concu ...

  4. 如何理解高并发中的协程?协程的实现和历史

    <Libco是一个C/C++协程库,在微信服务中广泛使用> <协程到底是什么?> <如何理解高并发中的协程?协程的实现和历史> 目录 普通的函数 从普通函数到协程 ...

  5. pdf 深入理解kotlin协程_协程初探

    Hello,各位朋友,小笨鸟我回来了! 近期学习了Kotlin协程相关的知识,感觉这块技术在项目中的可应用性很大,对项目的开发效率和维护成本有较大的提升.于是就考虑深入研究下相关概念和使用方式,并引入 ...

  6. 协程:协程的创建和使用。

    python是一门解释性语言,在python编程中,我们定义了几个运行过程,A - B - C ,解释器按照顺序执行,A - B - C 然后执行完毕.但是程序的运行需要花费时间,再看上面的例子 ,假 ...

  7. 深入并发线程、进程、纤程、协程、管程与死锁、活锁、锁饥饿详解

    一.进程.线程.纤程.协程.管程概念理解 在现在你可能会经常看到进程.线程.纤程.协程.管程.微线程.绿色线程....一大堆xx程的概念,其实这些本质上都是为了满足并行执行.异步执行而出现的一些概念. ...

  8. Kotlin学习笔记24 协程part4 协程的取消与超时

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 如何取消协程 import kotlinx.coroutines.*/*** 协程的取消*/fun main() = ...

  9. 王学岗Kotlin协程(三)---协程的上下文与协程的异常处理

    协程的上下文 我们使用构建器Launch去启动协程的时候,都需要指定协程上下文(没有显示指定会使用默认值). 协程上下文(CoroutineContext)是一组用于定义协程的行为元素.它由如下几项构 ...

最新文章

  1. java实现在pdf文档上填充内容
  2. new和malloc的区别
  3. oracle23290,详细介绍Oracle数据库EM Console重建过程
  4. 华为鸿蒙不再孤,华为鸿蒙OS系统不再孤单!又一款国产系统启动内测:再掀国产替代化...
  5. C++STL泛型编程基础知识讲解--------2015年2月3日
  6. 笨办法学R编程(4)
  7. 基于51单片机的金沙滩12864的计算器
  8. winpe加载raid_winpe里添加raid驱动
  9. vue-element-admin-master 在线教育 - 【4】你用 POI,我已经用 EasyExcel 了+课程科目管理
  10. 2021年 阿里云商标注册申请的相关详情及分类介绍
  11. source-map
  12. java8对类集合使用 Comparator.comparing 进行排序
  13. iOS XCode支持低系统版本
  14. 一场Pandas与SQL的巅峰大战
  15. OSChina 周二乱弹 —— 我和高中女同学表白了
  16. Zoom and pan, introduction to FabricJS part 5(缩放和平移,介绍Fabric.js第五部分)
  17. 如何将代码插入到Word文档
  18. PhpStudy 后门分析
  19. wr885n 虚拟服务器,TP-Link TL-WR885N V1-V3路由器桥接设置教程 | 192路由网
  20. 公司内部邮箱如何注册呢?外贸企业邮箱价格多少钱?

热门文章

  1. python 生孩子朋友圈_生孩子朋友圈报喜范文 生孩子报喜微信怎么写
  2. html字体大小间距,自定义CSS字间距行间距宽度大小
  3. 回声检测仿真信号matlab,回声信号的产生及消除.doc
  4. mate40pro5G升级鸿蒙,华为Mate40 Pro+5G+鸿蒙系统,下半年最值得期待的华为旗舰机?...
  5. 我的创作二周年纪念日
  6. PHP相关系列 - 蚂蚁变大象:浅谈常规网站是如何从小变大的
  7. Android瀑布流照片墙、滑动切换图片
  8. routes 选项参数
  9. Confluent本地安装和使用
  10. 视频解析网站源码 安装简单上传即用