问题 问答题

假设有两个线程(编号为0和1)需要去访问同一个共享资源,为了避免竞争状态的问题,我们必须实现一种互斥机制,使得在任何时候只能有一个线程在访问这个资源。假设有如下的一段代码:



当一个线程想要访问临界资源时,就调用上述的这两个函数。例如,线程0的代码可能是这样的:


试问:

以上的这种机制能够实现资源互斥访问吗为什么

答案

参考答案:这种机制不能实现资源的互斥访问,考虑如下的情形:
①初始化时,flag数组的两个元素值均为FALSE;
②线程0先执行,在执行while循环语句时,由于flag[1]=FALSE,所以顺利结束,不会被卡住。假设这个时候来了一个时钟中断,打断它的运行;
③线程1去执行,在执行while循环语句的时候,由于flag[0]=FALSE,所以顺利结束,不会被卡住,然后就进入了临界区;
④后来当线程0再执行的时候,也进入了临界区,这样就同时有两个线程在临界区。
总结:不能成功的根本原因是无法保证Enter_Critical_Section()函数执行的原子性,我们从上面的软件实现方法中可以看出,对于两个进程间的互斥,最主要的问题就是标志的检查和修改不能作为一个整体来执行,因此容易导致无法保证互斥访问的问题。

单项选择题
问答题 论述题