linux Posix 信号量 三 (经典例子)
本文将阐述一下信号量的作用及经典例子,当中包括“《越狱》寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等
首先,讲 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 信号量 一
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...
- linux Posix 信号量 二
一.Posix信号量 1.Posix信号量分为两种: 1. 有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2. 内存信号量:存放在共 ...
- linux POSIX信号量
POSIX信号量机制是3种IPC机制之一,3种IPC机制源于POSIX.1的实时扩展. 创建一个新的命名信号量或者使用一个现有信号量 #include <fcntl.h> #include ...
- Linux进程同步之POSIX信号量
POSIX信号量是属于POSIX标准系统接口定义的实时扩展部分.在SUS(Single UNIX Specification)单一规范中,定义的XSI IPC中也同样定义了人们通常称为System V ...
- Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
- 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 ...
随机推荐
- VS+Qt使用资源
转:https://blog.csdn.net/wxb1553725576/article/details/42042869 在vs环境下用qt进行开发时,常常需要用到各种资源,如图表.样式表等.在这 ...
- linux下如何退出tmux和重新进入tmux
1.退出(detach)当前tmux ctrl+d 2.重新进入tmux tmux attach -t <target-session> 如:当前有很多session,那么选择哪一个呢? ...
- System.Data.SQLite未能加载文件或程序集
1.简直是作死帝呀.不需要修改dll的名字,否则就坐等悲剧吧 如果项目中有x86和x64的dll,可以建两个不同的文件夹分别存放,但是千万不要修改掉默认的dll的名字 System.Data.SQLi ...
- 论OI中最大值的选取
为什么我的Floyd会输出负数啊? 为什么我的代码写对了却全都爆零了啊? 那么很可能是你的INF取大/小了! 那么inf到底应该取什么值呢? 首先,inf应该要比一般的题目中出现的数据要大,但是又不能 ...
- JavaScript Number() Vs new Number()
最近在优化一个页面时候.IDEA 提示我错误的使用了包装类.当时感觉很诧异. 随后.我上Stack Overflow上面查了一下,终于发现了问题所在. new Number('123') 与 Numb ...
- 递归--练习3--noi7592求最大公约数问题
递归--练习3--noi7592求最大公约数问题 一.心得 两个低级错误:1. ll setMax(ll &m,ll &n)中无引用,结果只传值,没传地址2. return f(n,m ...
- vscode的keybindings.json 和 AHK 脚本映射Win键
vscodehotkey.ahk https://github.com/m2nlight/AHKVSCodeLikeMac ; Shortcuts like mac ; Written by Bob ...
- 先对结果集排序然后做update、delete操作
--先排序然后删除第n条数据delete from scott.emp where empno in (select empno from (select * ...
- 本人遇到的spring事务之UnexpectedRollbackException异常解决笔记
本人最近在使用spring事务管理的过程中遇到如下异常,导致服务端抛出500给前端,让搞前端的哥们抱怨我心里着实不爽,前前后后折腾了近半个小时才得于解决,今天就做个笔记,以免日后又犯这个错误.好了,错 ...
- Hadoop1.2.1完全分布模式安装教程
假设有三台机器,它们的IP地址和对应的主机名为: 192.168.12.18 localhost.localdomain 192.168.2.215 rhel5 ...