#学志#进程同步的TestAndSet的理解

do{
     waiting[i] = true                 // 表示进程Pi处于等待获取锁的状态
     key = true;
     while(waiting[i]&&key)
          key=TestAndSet(&lock);       //  如果进程Pi抢到了锁,记录key=false
     waiting[i]=false;
 
     critical section
 
     j=(i+1)%n;
     while(j!=i && !waiting[j])            // 进程Pi处于等待获取锁的状态
         j = (j+1)%n;
     if(j==i)
          lock = false;
     else
          waiting[j] = false;
 
      remainder section
}while(1);



解释:

临界区条件1:互斥
     第一个进入的进程Pi要等执行了
TestAndSet之后才能进入,这时
Pi的key=false,其他进程key=true;
     后续进入的进程Pi,只有在其他
进程将waiting[i]设为false之后,才
可能进入
 
 
临界区条件2:空闲让进
     初始,key和所有的waiting[i]都为
True,lock=false,因此首次执行
TestAndSet的进程会进入临界区
     当进入临界区的进程Pi执行完
临界区操作之后,在退出区,通过
While循环扫描当前处于等待状态的
进程j (j!=i),
-如果找到j,那么waiting[j]被设为false,
  Pj会随后进入临界区
-如果没有找到j,那么lock被置为false
总之,只要临界区资源空闲,想进入
临界区的进程(其waiting[j]=true)都
会被放进临界区

 
 
临界区条件3:有限等待
     每个进程退出临界区的时候,
总会按顺序执行一个扫描,
这个循环扫描的过程保证一个进程
最多等待n-1次即可进入临界区操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值