2011-10-02 10 views
-2

사용자 수준의 스레드 라이브러리를 개발했습니다. 코드에서 때때로 교착 상태가 발생하지만 그 이유를 파악할 수 없습니다. 또 다른 스레드가 당신의 while 테스트 및 스왑 사이에 잠금을 얻을 수뮤텍스 코드에서 교착 상태가 발생했습니다.

int gtthread_mutex_lock(gtthread_mutex_t *mutex) 
{ 
    if(!mutex) //checks if mutex is null 
     return -1; 
    while(mutex->available==1); //spin locks if mutex is already locked by someone else 
    __sync_val_compare_and_swap(&mutex->available,0,1); //atomic function to swap value 0 with 1 
    mutex->owner=node->th; 
    return 0; 
} 

int gtthread_mutex_unlock(gtthread_mutex_t *mutex) 
{ 
    if(!mutex) return -1; 

    if(mutex->available) 
    { 
     mutex->available=0; 
     mutex->owner=NULL; 
    } 
    return 0; 
} 
+2

숙제 : http://www.cc.gatech.edu/classes/AY2005/cs6210_fall/Project1writeup.html – jman

+0

예, 프로젝트입니다. 나는 코드를 요구하지 않는다. 나는 뮤텍스가 작동하지 않는 상황에 대해서만 묻고있다. :) – CuriousCoder

답변

1

: 여기에 뮤텍스 잠금 및 잠금 해제 기능을위한 코드입니다.

__sync_val_compare_and_swap의 반환을 확인하고 성공하지 못한 경우 계속 반복해야합니다.

또한 잠금을 해제하면 다른 스레드에서 작성한 정보를 삭제할 수 있기 때문에 소유자를 추적하는 코드가 작동하지 않습니다.

더 나은 것은 하나의 필드 (원자 연산으로 처리됨)가 소유자의 정보를 보유하고 있고 0이없는 경우 0입니다.

관련 문제