利用记录型信号量机制: wait(s), signal(s)解决进程同步问题
2017-06-20 00:58
435 查看
wait(s) 等价与P操作, signal(s)等价于V操作
此外 ,可参考java的实现:http://www.cnblogs.com/zyp4614/p/6555530.html
司机开车,售票员售票。当售票员将门关上的时候司机才可以开车,当司机将车到站停下的时候,售票员才可以打开车门。
对S1(门): 门有两个状态,开和关。售票员将门关上之后,应该将门的操作权给司机(因为只有司机到站了才能停车)。因此0为门开着状态。
对S2(车):两个状态,开车行驶和到站停车。当车开的时候,需要申请车的资源,即用wait,则车在停着的时候状态为1,行驶时状态为0.
司机:开车,正常行驶,到站停车
售票员:关门,售票,开门
**S1表示是否允许司机启动汽车;S1 = 1表示可以启动,S2 = 0表示不能启动。
S2表示是否允许售票员关车门;S2 = 1表示允许售票员关车门,S2 = 0表示不允许售票员关车门。**
可参考博客: http://m.blog.csdn.net/Y_215/article/details/53467517
生产者-消费者问题
int in = 0, out = 0; item buffer ; semaphore mutex = 1, empty = n, full = 0; void procuder() { do { procuder an item nextp; ... wait(empty);//表示空缓冲区-1; wait(mutex);//数据缓冲区互斥访问,关闭访问; buffer[in] = nextp; in = (in+1) % n; signal(mutex);//打开访问 signal(full);//满缓冲区加+1 } while (true); } void consumer() { do { wait(full);//判断是否有满缓冲区,满缓冲区-1 wait(mutex); nextc = buffer[out]; out = (out+1) % n; signal(mutex); siganl(empty);//空缓冲区+1 consumer the item in nextc; .... } while (true); } void main() { cobegin producer(); consumer(); coend }
爸爸妈妈洗水果,儿子女儿吃水果问题
问题描述:爸爸专向盘中放苹果,妈妈专向盘中放橘子,儿子专等吃盘里的橘子,女儿专等吃盘里的苹果。只要盘子空,爸爸妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出他们四人之间的同步关系,并用PV操作实现四人正确活动的程序。。使用p、v操作来完成父亲、妈妈、儿子、女儿的同步行为模拟。semaphore putmutex = 1, getmutex = 0; semaphore empty = 1, apple = 0, orange = 0; void father() { do { wait(putmutex); apple++; empty--; signal(putmutex); } while (true); } void mother() { do { wait(putmutex); orange++; empty--; signal(putmutex); } while (true); } void son() { do { wait(getmutex); orange--; empty++; signal(getmutex); } while (true); } void daughter() { do { wait(getmutex); apple--; empty++; signal(getmutex); } while (true); } void main() { cobegin father(); mother(); son(); daughter(); coend }
此外 ,可参考java的实现:http://www.cnblogs.com/zyp4614/p/6555530.html
司机,售票员问题
问题:司机开车,售票员售票。当售票员将门关上的时候司机才可以开车,当司机将车到站停下的时候,售票员才可以打开车门。
对S1(门): 门有两个状态,开和关。售票员将门关上之后,应该将门的操作权给司机(因为只有司机到站了才能停车)。因此0为门开着状态。
对S2(车):两个状态,开车行驶和到站停车。当车开的时候,需要申请车的资源,即用wait,则车在停着的时候状态为1,行驶时状态为0.
司机:开车,正常行驶,到站停车
售票员:关门,售票,开门
**S1表示是否允许司机启动汽车;S1 = 1表示可以启动,S2 = 0表示不能启动。
S2表示是否允许售票员关车门;S2 = 1表示允许售票员关车门,S2 = 0表示不允许售票员关车门。**
semaphore s1 = 1, s2 = 0; void driver() { do { wait(s1);// P(S1) 开车; 正常行驶; 到站停车; signal(s2);//V(S2) } while (true); } void seller() { do { 关门; signal(s1);// V(S1) 售票; wait(S2);//P(S2) 开车门; 上下乘客; } while (true); } void main() { cobegin driver(); seller(); coend }
可参考博客: http://m.blog.csdn.net/Y_215/article/details/53467517
相关文章推荐
- 利用记录型信号量机制: wait(s), signal(s)解决进程同步问题
- 运用信号量解决进程同步问题之整型信号机制、记录型信号量机制、信号量集机制
- linux 中的进程wait()和waitpid函数,僵尸进程详解,以及利用这两个函数解决进程同步问题
- Unix编程(二)C语言利用PV原句解决5个经典的进程同步问题
- 利用oracle快照dblink解决数据库表同步问题
- 进程同步之信号量机制(pv操作)及三个经典同步问题
- SVN利用post-commit hooks自动同步代码到生产环境,解决大数量文件更新同步问题
- 追逐自己的梦想----------辅助制作第八课:利用SetWindowsHook将进程注入游戏主线程来解决资源冲突的问题
- 信号量---解决进程间的同步与互斥问题之1
- [置顶] 解决项目中不同进程中使用SharedPreferences存取数据不同步的问题
- 利用redis存储session,解决登录同步问题
- SVN利用post-commit hooks自动同步代码到生产环境,解决大数量文件更新同步问题
- 利用epoll和多进程解决高并发问题
- 利用oracle快照dblink解决数据库表同步问题
- STRUTS中利用同步令牌(Token)解决重复提交的问题(转载)
- 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题
- svn利用svnsync同步时出现问题解决
- 进程同步:问题的解决,原语
- 进程同步之信号量机制(pv操作)及三个经典同步问题
- 用PV操作解决进程之间的同步互斥问题