假设有一个进程拥有两个线程(编号为0和1)需要去访问同一个共享资源,为了避免竞争状态的问题,必须实现一种互斥机制,使得在任何时候只能有一个线程在访问这个资源。假设有如下的一段代码: int flag[2];/*flag数组,初始化为FALSE*/

admin2014-04-17  32

问题 假设有一个进程拥有两个线程(编号为0和1)需要去访问同一个共享资源,为了避免竞争状态的问题,必须实现一种互斥机制,使得在任何时候只能有一个线程在访问这个资源。假设有如下的一段代码:
    int flag[2];/*flag数组,初始化为FALSE*/
    Enter_critical_section(int my_thread_id),int other_thread_id)
    while  (flag[other_thread-id]=TRuE);  /*空循环语句*/
    flag[my_thread_id]=TRUE;
    }
    Exit_Critical_Seetion(int my_thread_id),int other_thread_id)
    {
    flag[my_thread_id]=FALSE;
    }
    当一个线程想要访问临界资源时,就调用上述的这两个函数。例如,线程0的代码可能是这样的:
    Enter_Critical_Section(0,1);
    ……使用这个资源……
    Exit_Critical_Section(0,1),
    ……做其他的事情……
    试问:
以上的这种机制能够实现资源互斥访问吗?为什么?

选项

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

解析
转载请注明原文地址:https://kaotiyun.com/show/5ixi777K
0

最新回复(0)