一、信号量的缺点

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

如果在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语言管程例子,管程 - it610.com相关推荐

  1. c语言管程例子,管程

    一.信号量的缺点 信号量的使用一定要小心,如下图中解决生产者-消费者问题的程序: 如果在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. 最强通道注意力来啦!金字塔分割注意力模块,即插即用,效果显著,已开源!...
  2. 你什么时候觉得自己会被边缘化?
  3. linux方向键ascii_上下左右 方向键的ASCII码值是多少?
  4. 多线程:什么是ThreadLocal?应用场景?
  5. OpenGL text rendering文字渲染的实例
  6. 操作系统课设之Windows 的互斥与同步
  7. 信息学奥赛一本通(1093:计算多项式的值)
  8. 最喜欢计算机和科学英语作文,英语作文:我最喜欢的科学家
  9. Spring框架----Spring的基于XML的AOP的实现
  10. 【算法导论第13章】红黑树
  11. linux ftp查看列表命令,linux查询ftp命令
  12. 渐变色【R Color】
  13. Go语言第一课背后的那些事儿
  14. FPGA跨时钟域打两拍和三拍问题
  15. 计算机变量与变量地址,数据缓冲区与变量的地址(更新1)
  16. Java 结构化数据处理开源库 SPL
  17. 论文阅读 (二十三):Attention-based Deep Multiple Instance Learning (2018)
  18. linux 换一个路径存储新的挂载nas盘
  19. oracle巡检表,ORACLE日常巡检内容
  20. 绝密!2021年劳动节趣味测试题 (大数据版 )| 文末抽奖

热门文章

  1. 北京XXX学院WLAN项目现场勘查报告
  2. 怎么注销midas服务器程序,MIDAS的服务器镜像技术
  3. enterprise architect复制到word中的标签怎么改变_7个 Word 技巧,不会别说自己会 Word...
  4. 计算机培训研修日志,2021年计算机培训研修日志
  5. laravel 定时任务
  6. mysql切换到使用openssl,MySQL主从复制+OpenSSL
  7. vba传值调用_Access VBA如何使用Shell命令以及如何传递参数
  8. php简单的mysql类_超简单php mysql数据库查询类
  9. 一个数变成0的概率有多少?(记忆化搜索)
  10. ConneR and the A.R.C. Markland-N CodeForces - 1293A(暴力)