本文将阐述一下信号量的作用及经典例子,当中包括“《越狱》寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等
首先,讲 semWait操作(P操作)和semSignal操作(V操作)的一些基本原则。(接下来同意称为P,V操作)
1. P操作,s - -,if(s<0)阻塞自己
2. V操作,s++,if(s<=0)唤醒一个其他进程
3. P,V操作时原语(通俗讲,就是执行PV操作时时不能被打打断的)
4. P,V操作总是成对出现的。P:资源申请/分配;V操作:资源的释放
一般每个进程的PV操作代码:
s = ? //根据资源数进行初始化
P(s)
临界区
V(s)
一.《越狱》寄信
题目描述:
T-boy给brad送信,Mike给Lincon送信,但他们送信收信都通过同一个树洞。
解答:
信号量:
Lincon: 是否有Mike的信,s1 = 0
Brad: 是否有T-boy的信,s2 = 0
Mike和T-boy: 树洞是否为空,s3 = 1
Mike: T-boy: Lincon: Brad:
write() write() P(s1) P(s2)
P(s3) P(s3) getit() getit()
putit() putit() V(s3) V(s3)
V(s1) V(s2) readit() readit()
二. 家庭吃水果(对第一题的扩充,不同的只是现在资源比之前多了,变成了3个)
解答:
信号量:
儿子: 是否有苹果,s1 = 0
女儿: 是否有桔子,s2 = 0
爸妈: 是否可以放水果,s3 = 3
爸: 妈: 儿子: 女儿:
makeit() makeit() P(s1) P(s2)
P(s3) P(s3) getit() getit()
putit() putit() V(s3) V(s3)
V(s1) V(s2) eatit() eatit()
三. 五子棋
题目描述:白子和黑子各有32个,黑子先行,怎样设置信号量,才能黑子先行,且是交替下子
解答:
信号量:
白子可下吗? s1 = 0
黑子可下吗? s2 = 1
白 黑
for(i=0;i<32;i++){ for(i=0;i<32;i++){
取子 取子
P(s1) P(s2)
放白子 放黑子
V(s2) V(s1)
} }
四.接力赛跑
题目描述:四个人进行接力赛跑,要求使用信号量的方法使得跑的顺序是P1->P2->P3->P4
解答:
信号量:
s2:2号接棒 0
s3:3号接棒 0
s4:4号接棒 0
P1 P2 P3 P4
P(s2) P(s3) P(s4)
run run run run
V(s2) V(s3) V(s4)
接上篇的信号量经典例题,其中包括“读者写者”,“过独木桥”,“公交车”,“四方恋爱”等
一. 读者写着问题(这里有很多种情况):
(1)读者优先
题目描述:有一本书,有多个读者和写者,读写互斥,写写互斥。当多个读者可以同时读,即当有读者在读这本书时,其他的读者也可以进来读,但写者就不能进来写。
解答:
信号量:
w:可写否:1
nReader:读者数 :0
mutex:读者之间的“互斥”,进出的先后顺序而已:1
写者: 读者
P(w) P(mutex)
写 nReader ++
V(w) if(nReader == 1)//第一个读者
P(w) //堵塞写者
V(mutex)
读
P(mutex)
nReader - -
if(nReader==0)//最后一个读者
V(w) //唤醒写者
V(mutex)
(2)写者优先
题目描述:有一本书,有多个读者和写者,读写互斥,写写互斥,不同的是只要有写者等,后续读者必须等待在写者后面
w:可写否:1
nReader:读者数 :0
mutex:读者之间的“互斥”,进出的先后顺序而已:1
s:用于封锁后续读者 :1
写者: 读者
P(s)
P(s) P(mutex)
P(w) nReader ++
写 if(nReader == 1)//第一个读者
V(w) P(w) //堵塞写者
V(s) V(mutex)
V(s)
读
P(mutex)
nReader - -
if(nReader==0)//最后一个读者
V(w) //唤醒写者
V(mutex)
二.过独木桥
题目描述:
桥单向通行,分别从西到东和从东到西
解答:
信号量:
s : 表示桥可用? :1
nw : 东向西人数 :0
ne : 西向东人数 : 0
m1: 互斥对nw的修改 :1
m2: 互斥对ne的修改 :1
ToWest ToEast
P(m1) P(m2)
nw++ ne ++
if(1==nw) if(1==ne)
P(s) P(s)
V(m1) V(m2)
cross the bridge to west cross the bridge to east
P(m1) P(m2)
nw-- ne - -
if(0==nw) if(0==ne)
V(s) V(s)
V(m1) V(m2)
三.四方恋爱
题目描述:有两男两女,男士送女士玫瑰,女士送男士手表。一一对应,每个只能连接一个
解答:
(1)老师答案
信号量:
m1:互斥女士之间的收花送表行为:1
m2:互斥男士之间的收表送花行为:1
s1:有花? 0
s2:有表? 0
女士 男士
P(s1) P(m2)
P(m1) 送花
收花 V(s1)
送表 P(s2)
V(s2) 手表
V(m1) V(m2)
恋爱 恋爱
(2)自己的答案
四个分别是李四(男),张三(男),嘻嘻(女),哈哈(女)
信号量:
g1:是否有表收 :0
g2:是否有玫瑰收:0
s1:是否可以送表:1
s2:是否可以送玫瑰:1
note:这里只运行一次的,不能够循环
李四 张三 嘻嘻 哈哈
P(s2) P(s2) P(s1) P(s1)
sendRose() sendRose sendWatch sendWath
V(g2) V(g2) V(g1) V(g1)
P(g1) P(g1) P(g2) P(g2)
getWatch getWatch getRose getRose
V(s1) V(s1) V(s2) V(s2)
ps:这个解答我逻辑上想了一下,没有错误,但我一个同学说实际上载机器上跑时好像有问题,自己就没想明白,请高手指教了
linux POSIX 信号量介绍
信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...
linux Posix 信号量 一
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...
linux Posix 信号量 二
一.Posix信号量 1.Posix信号量分为两种: 1. 有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2. 内存信号量:存放在共 ...
linux POSIX信号量
POSIX信号量机制是3种IPC机制之一,3种IPC机制源于POSIX.1的实时扩展. 创建一个新的命名信号量或者使用一个现有信号量 #include #include ...
Linux进程同步之POSIX信号量
POSIX信号量是属于POSIX标准系统接口定义的实时扩展部分.在SUS(Single UNIX Specification)单一规范中,定义的XSI IPC中也同样定义了人们通常称为System V ...
Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...
linux c编程:Posix信号量
POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉 ...
第三十九章 POSIX信号量与互斥锁
POSIX信号量相关函数 sem_open 功能: initialize and open a named semaphore 原型: sem_t *sem_open(const char *name ...
随机推荐
Lind.DDD.RedisClient~对StackExchange.Redis调用者的封装及多路复用技术
回到目录 两雄争霸 使用StackExchange.Redis的原因是因为它开源,免费,而对于商业化的ServiceStack.Redis,它将一步步被前者取代,开源将是一种趋势,商业化也值得被我们尊 ...
Second Day: 关于Button监听事件的三种方法(匿名类、外部类、继承接口)
第一种:通过匿名类实现对Button事件的监听 首先在XML文件中拖入一个Button按钮,并设好ID,其次在主文件.java中进行控件初始化(Private声明),随后通过SetOnClickLis ...
execve(file, argv, env)参数argv获取字符串个数
/* Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU ...
IOS开发-表单控件的应用
1. 需求描述 2. 开发环境介绍 3. 创建一个工程 4. 工程配置介绍 5. 目录结构介绍 6. 界面设置 7. 关联输入输出 8. 关联事件代码 9. 运行结果 10. UITextField ...
Model First:创建实体数据模型(ADO.NET 实体数据模型)
Microsoft Entity Framework是一个对象关系映射工具(Object Relational Mapping ,O/RM)工具.它可以让你从一个数据库自动地生成数据接入层.实体框架免 ...
Traffic Lights - SGU 103(最短路)
题目大意:有一个城市的路线图,有N个交叉点,每两个交叉点之间只有一条路,现在想从交点u去交点v,不过这个路的交通比较特别,每个路都有一个交通灯,灯有两种颜色,蓝色和紫色,例如一条路线在交点s,t之间, ...
Dijkstra算法and Floyd算法 HDU 1874 畅通工程续
Dijkstra算法描述起来比较容易:它是求单源最短路径的,也就是求某一个点到其他各个点的最短路径,大体思想和prim算法差不多,有个数组dis,用来保存源点到其它各个点的距离,刚开始很好办,只需要把 ...
POI创建Excle
1.导包 2.Demo Workbook wb=new HSSFWorkbook();//创建工作空间 Sheet sh= wb.createSheet("工作表1");//创建工 ...
HDU 4081 Qin Shi Huang&#39;s National Road System 次小生成树变种
Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...
简单计算器 安卓 Android 作业
Android老师布置的课程作业——简单计算器 功能要求实现四则运算,参考界面见下图: 首先给各位老铁提供apk安装包以及项目压缩包,略表诚意~ github地址:https://github.com ...