进程间同步临界区的Peterson算法

 

在所有项目中,进入和退出临界区时都有输出以表示已进入和退出临界区。临界区内的操作是将公共变量iCount这个两个线程的公共变量叠加到50,000,000然后输出,以此证明线程成功进入临界区,满足互斥;因为倘若没有实现互斥,两线程间的干扰会导致数据一致性问题而使iCount不能准确加到50,000,000。从实验结果中,可以看出所有进入临界区的线程都至少满足互斥。为了保证实验的正确性,我们多次执行线程(程序中设为5次),这些后面将不再赘述。

 

算法一:

 

 

 

算法一是错误的,因为它不符合有空让进的要求。为了实验效果明显,更有说服力,在项目中故意增加了0号线程的剩余区的操作时间,并隔一段时间输出在剩余区这一状态。从实验项目的运行结果可以看出。0号线程进入临界区完成操作退出后,1号线程进入临界区并完成操作,退出后,此时0号线程已进入其退出区,而1号线程因为无退出区操作,故现在正在等待进入临界区,可是因为算法的错误,导致1号线程不能进入其临界区(从实验结果中看出,长时间0号输出其在剩余区的状态,而1号未进入其临界区)此时等待进入临界区的只有1号线程,明显不符合有空让进的要求。事实上,从输出可以看出,此算法使两线程严格交替着进入其相应的临界区。

 

算法二:

 

 

算法二也是错误的,因为它不符合有限循环。事实上这一次退出区没有额外操作,只是在线程的等待上在WaitForMultipleObjects有个时间限制,因为这个算法有可能会导致两线程都进入while的无限循环,从而导致两着都无法自动关闭,程序无法正常退出。当刚好每个线程的flag[iThreadID] = true语句依次连续执行时,就会导致两线程都在while语句中无限循环。从实验结果中可见,0号线程只进入临界区2次、1号线程只进入临界区1次,就进入了无限循环中,直到WaitForMultipleObjects超时,程序退出。

 

算法三:

 

算法三是正确的,这个才是Peterson算法的正确表达形式。

 

这是我的操作系统实验的一些内容,达人们肯定觉得浅显。没事就发上来了,搞了好久那个贴图都没搞满意,如果要看直接运行了然后看吧,我就不贴弄了。

若要使用源码,请注明出处,欢迎转载(不过,我觉得可能性很小,嘿嘿!)

http://blog.csdn.net/zha_1525515/archive/2009/10/27/4733056.aspx

 

最后,欢迎拍砖吧!

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值