Dekker算法3-先表明意愿再检查 PO P1 Flag[o=true; a Flag[1]=true; 2 While flag[1 ];2 b While flag[0]; 临界区 c临界区; Flag[0]=false; d Flag[1]=false; 如果P0在临界区内失败,P1会永久阻塞 可能导致死锁
Dekker算法3-先表明意愿再检查 P0 … Flag[0]=true; While flag[1]; 临界区; Flag[0]=false; … P1 … Flag[1]=true; While flag[0]; 临界区; Flag[1]=false; … • 如果P0在临界区内失败,P1会永久阻塞 • 可能导致死锁 1 2 3 4 a b c d 1 a 2 b
Dekker算法4-根据对方状态决定是否让步 PO 活锁 Flag[o]true Flagl1]true While flag[1: While flag[ol: Flag[oFfals, Flag[1Ff false Delav Delay: Flag[o true Flag[ true 临界区; 临界区 Flag[o]false Flagl1]false;
Dekker算法4-根据对方状态决定是否让步 P0 … Flag[0]=true; While flag[1]; {Flag[0]=false; Delay; Flag[0]=true; } 临界区; Flag[0]=false; … P1 … Flag[1]=true; While flag[0]; {Flag[1]=false; Delay; Flag[1]=true; } 临界区; Flag[1]=false; … 活锁
Deke算法更正-用tm表示该谁坚持 PO P1 While true While true Flag[o]true, Flag[true 我想进入临界区 While flag[1] While flag[o 如果对方也想, If turn == 1 If turn ==0 如果该P0坚持,则 fgo=fale;i{fag= false;我暂时让步 While turn=1; While turn==0;等待对方退出 flag[O]=true; 3 临界区; 界区 Turn=1 歌1=me:然后我再表明意愿 urn=0 现在允许P0进入 Flag[oFfals Flag[1]false
Dekker算法更正-用turn表示该谁坚持 P0 … While true {Flag[0]=true; While flag[1] If turn == 1 {flag[0]=false; While turn==1; flag[0]=true;} 临界区; Turn=1; Flag[0]=false; } P1 … While true {Flag[1]=true; While flag[0] If turn == 0 {flag[1]=false; While turn==0; flag[1]=true;} 临界区; Turn=0; Flag[1]=false; } 我想进入临界区 如果对方也想,则 如果该P0坚持,则 我暂时让步 等待对方退出 然后我再表明意愿 现在允许P0进入