testandset() 원래 코드는


이러함


그냥 락을보고 참인지거짓인지 리턴하고 무조건 참으로 set함..


이걸로 임계영역 상호배제를하는데


while(testandset(lock));


임계영역 코드;


나올때 lock=false로 수정;



이렇게됬는데 이건 무한대기로 빠진다고하네요


그래서 아마 제생각에는 이것도 임계영역에서 실패하면 lock이 true인 상태로 남고 바꿔주질못해서


무한대기하는것같은데


교과서에서는 이걸


이렇게 바꾸고 무한대기를 해결한다고 합니다.




do{


key=true;

while(waiting[i] && key)

{

key = testandset(lock); // 초기에는 lock이 false로 설정해놓습니다.

}

waiting[i] = false;





임계영역 코드;





j = (i+1)%n;


while(j!=i) && waiting[j])

j = (j+1)%n;


if(j==i)

lock =false;

else

waiting[j]=false; //임계영역나올때 처리



}while(1)



근데 제 생각에 이것도 역시 임계영역내에서 프로세스가 실패하게되면


다른프로세스들은 영원히 못들어가지않나요???


임계내에서 실패하면 lock은 영원히 true일것이고


다른프로세스들의  key도 영원히 true만 반환하니깐


영원히 while문을 돌지않난요?