在所有项目中,进入和退出临界区时都有输出以表示已进入和退出临界区。临界区内的操作是将公共变量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
最后,欢迎拍砖吧!