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

一、信号量的缺点

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

62e8592670944df81a51f29888bc7e99.png

如果在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前,消费者进程根本不可能进入管程

四、代码示例

c595becba2ea20ab0309304f99d4ad97.png

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

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

bf7c40972f72a20c8eabee383990366f.png

89a34377913af5f17356f8615e06ad30.png

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日本电影《花样奇缘》:人生是一场疯狂奇妙的梦境

■片名:《花样奇缘》(嫌われ松子の一生) ■出品:日本 ■出品时间: 2006年 ■导演:中岛哲也 ■演员: 中谷美纪、瑛太、伊势谷友介、香川照之 ■ 获奖情况:第一届亚洲电影大奖最佳女演员、第61届每…

看洋人品茶

地点:茗福轩西班牙的一对情侣。老板娘在用电脑讲解。品完茶好像不过瘾,还要去酒吧喝点。

c语言设计一个万年历的需求分析,万年历设计报告

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#includechar* month_str[]{"January","February","March","April","May","June","July","August","September","Octob…

《魔鸟》:上帝可以宽恕,魔鬼却一个都不放过

《魔鸟》( The Raven) 2006年非常特别的恐怖电影,全名叫《埃德加爱伦坡的乌鸦》(Edgar allan poe’s The Raven)。而最近市面上出现的该DVD的内容介绍、导演及演员名单全是错误的。那是1963年由罗杰科尔曼导演、尼科尔…

在去长春和松源的路上

去吉林了3天。这是在火车和汽车上拍摄的照片。开始复苏和繁忙的春天的农村。在通往松源的路上,一个无名小站。

c语言二维数组赋值前面是行还是列,动态二维数组分配有问题啊 为什么行和列相同才能给数组赋值...

#include #include void fun(char **p1,char *p2,int p,int q);int main(){int m,n,g,d,f;char **x;char *y;puts("输入行和列");scanf("%d %d",&m,&n);while(getchar()!\n)continue;dm*n;printf("%d %d",m,n);x(char **)malloc(m* siz…

声称只懂动物、女人和写作的作家——胡东林

吉林作家胡东林。中国最好的描写自然和动物的小说家之一。听他讲动物的故事会让你着迷得废寝忘食,他似乎有永远讲不完的故事。为了更接近自然,他准备从长春搬到长白山原始森林边上居住。这是他的书房,里面贴满了他将使用的动物资料和小说细节…

android 语音读短信,读短信来电报姓名2021下载-读短信来电报姓名app下载10.50 安卓版-西西软件下载...

读短信来电报姓名app,正如起名字一样,短信语音通报内容,来电语音播报姓名!短信再也不用一条条的看了,让手机自己念出来吧;来电也会通知谁的来电呦,觉得有用就来下载吧,为需要这个功用…

直击于丹软肋的作家——李悦

昨天在北京第三极书局举行了《孔子很着急》《庄子很生气》两本书的首发式。作为该书的作者之一,内蒙作家李悦专程来京签售。他的左侧为著名学者黎鸣。李悦素有“塞外鬼才”之称。5岁就开始研读《论语》,写过许多小说和电影,近年注重中国文化的…

妙因寺的小喇嘛

妙因寺位于吉林省前郭尔罗斯蒙古族自治县境内,著名的查干湖畔。是吉林省唯一的藏传佛教寺庙。妙因,取自佛家“绝妙之行因,菩萨之大行也”。佛经云:“妙因斯满,极果顿圆”,这是菩萨修行的最高果位。妙因寺建…

android 开启wifi失败,[求助]获取基站/wifi信息为空或失败

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼RT,想做一个高德地图的简单定位功能。按照官方的教程和例子、视频,一模一样。但是在自己的eclipse编译后无论是使用模拟器还是将其export之后装在自己的电脑上,在OnLocationChanged(AMapLocation…

《紫茗红菱》:“80后”成长的欢乐、疼痛与代价

最近读了一部很厚的长篇小说《紫茗红菱》(春风文艺出版社2007年2月),作者是我的同族,一个叫鲍尔金娜的蒙古族女孩。当然,这部小说几乎没有一点蒙古的痕迹,有的是现代都市少年男女的最新鲜的故事——他们成长…

艺术家肖像之四

王艾,诗人、小说家、画家。地点:环铁王艾工作室。阿鲁斯,摄影师。地点:锣鼓巷沙漏咖啡

android sdk版本兼容,Android 版本兼容

常用命令查看一个手机的cpu架构adb shell cat /proc/cpuinfo查看手机的SDK版本adb shell getprop ro.build.version.releaseRequiresApi需要注意的是,该注解仅仅在编辑阶段才有用,如RequiresApi(api Build.VERSION_CODES.LOLLIPOP)private void func() …

万劫不复:恐怖悬疑话剧《下一个就是你》

关注恐怖悬疑文学和电影许多年,其实我最大的心愿是能看到国内的恐怖悬疑话剧,原因是想看看真人在舞台上表演的效果以及导演现场氛围的调度和营造。我一直觉得舞台虽然有真实的现场感,但是与小说或电影比较起来,其本身并不具备优势…

android webview 禁止放大缩小,WebView无法放大缩小解决方案

先看看我们之前所写的代码1)添加权限:AndroidManifest.xml中必须使用了许可"android.permission.INTERNET"2)使用了一个WebView组件android:id"id/wv"android:layout_width"fill_parent"android:layout_height"fill_parent"…

第三届类型文学研讨会小记(转)

2007年4月8日,为期两天的第三届类型文学研讨会在北京东方容和培训中心圆满结束。这次会议由北方文艺出版社、北京有容文化发展有限公司联合主办,文学评论家兴安、王干,恐怖悬疑文学作家老猫、那多、成刚、七根胡、花想容、酒狂等,…

android+busybox+编译,Android版busybox编译

Android版busybox编译1下载busybox源码2解压tar -xvf busybox-1.23.2.tar.bz23 android版的配置脚本解压后的源码里,configs文件压有android版本的配置脚本:android2_defconfig android_defconfig android_ndk_defconfig我选用的是android2…