#thread 1 do
void *do_work_one (void *param){
pthread_mutex_lock(&first_mutex);
pthread_mutex_lock(&second_mutex);
/**
* Do work
**/
pthread_mutex_unlock(&second_mutex);
pthread_mutex_unlock(&first_mutex);
prhtread_exit(0);
}
#thread 2 do
void *do_work_one (void *param){
pthread_mutex_lock(&second_mutex);
pthread_mutex_lock(&first_mutex);
/**
* Do work
**/
pthread_mutex_unlock(&first_mutex);
pthread_mutex_unlock(&second_mutex);
prhtread_exit(0);
}
⇒ 서로 뮤텍스를 갖고 있다 계속 방출하는 사이클이 보인다 → 3절에서 나온다.
#thread 1 do
void *do_work_one (void *param){
int done = 0;
while(!done){
pthread_mutex_lock(&first_mutex);
if (pthread_mutex_trylock(&second_mutex)){
/**
* Do work
**/
pthread_mutex_unlock(&second_mutex);
pthread_mutex_unlock(&first_mutex);
done = 1;
}
else{
pthread_mutex_unlock(&first_mutex)
}
prhtread_exit(0);
}
}
#thread 2 do
void *do_work_one (void *param){
int done = 0;
while(!done){
pthread_mutex_lock(&second_mutex);
if (pthread_mutex_trylock(&first_mutex)){
/**
* Do work
**/
pthread_mutex_unlock(&first_mutex);
pthread_mutex_unlock(&second_mutex);
done = 1;
}
else{
pthread_mutex_unlock(&second_mutex)
}
prhtread_exit(0);
}
}
⇒ 스레드가 동시에 저렇게 시도할 때 교착상태가 발생한다. 이 떄 대기 시간을 두면 해결할 수 있다.