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문을 돌지않난요?
코드는 개발새발 붙여놔서 따라 읽기 귀찮고, test and set 은 원래 상호배제는 만족하지만 한정대기는 만족하지 못함.
?? test and set이 한정대기원래안되는데 그걸 만족시키게한게 2번째코드임 그걸해결햇다고하는데 어떻게 해결된건지?