2011-01-23 1 views
0

나는 교착 상태를 보장하는 실험을하고있다.pthread_mutex_lock() 호출을 할 때 스레드가 성공하지 못하면 어떻게 될까요?

void *thread_1(void *vptr) 
{ 
    pthread_mutex_lock(&a); 
    sleep(1); 
    pthread_mutex_lock(&b); 
    pthread_mutex_unlock(&b); 
    pthread_mutex_unlock(&a); 
} 

void *thread_2(void *vptr) 
{ 
    pthread_mutex_lock(&b); 
    sleep(1); 
    pthread_mutex_lock(&a); 
    pthread_mutex_unlock(&a); 
    pthread_mutex_unlock(&b); 
} 

스레드가 잠글 수 없다면 어떻게 될까? 뮤텍스를 기다리는 대기열에 들어가거나 간단히 다음 명령으로 이동합니까?

답변

0

잠금 할 수없는 이유에 따라 다릅니다. 예를 들어 스레드가 이미 잠금을 보유하고 있으면 오류가 반환 될 수 있습니다. 반환 값을 확인하고 수동 페이지에서 errno으로 반환되는 오류 코드를 확인해야합니다. 광산 (리눅스)의 상태 : 두 스레드가 뮤텍스를 기다리는 영원히 정지됩니다 귀하의 경우

The pthread_mutex_lock() function may fail if: 

    EDEADLK 
      The current thread already owns the mutex. 
+0

프로세스 공유 뮤텍스에서 작동하지 않는 올바른 코드에서,'pthread_mutex_lock'는 결코 오류를 반환 할 수 없습니다. 반환 할 수있는 유일한 오류는 런타임에 예외적 인 조건이 아니라 * 프로그래밍 오류를 나타냅니다. –

+0

나는 * process-shared *와 함께 * robust *라고 말해야했습니다. 어쨌든 내 의견은'pthread_mutex_lock'의 리턴 값을 디버깅하거나 프로세스 공유 로버 스트 뮤텍스를 사용할 때 (필요한 경우'EOWNERDEAD '를 확인해야 함)를 제외하고는 필요하지 않음을 확인하는 것이 었습니다. –

+0

@R .: 내 편집 참조. –

1

. 한 번에 두 스레드를 시작하면.

왜 뮤텍스와 스레드를 만든 다음 예제를 실행하지 않으시겠습니까?

+0

그것은 단지 실험입니다. – andandandand

1

스레드가 이미 다른 스레드에 의해 잠긴 뮤텍스를 잠그려고하면 일시 중단됩니다. 이 경우, 잠금을 획득 할 때까지 실행이 계속되지 않습니다. ("대기열"은 없다. 대기중인 스레드의 정렬되지 않은 집합이다.) 기다리는 스레드는 뮤텍스를 획득 한 다음 수 있습니다.

스레드가 이미 제대로 초기화 자체에 의해 잠겨 있거나되지 않은 뮤텍스를 잠그려고 할 경우, pthread_mutex_lock() 0이 아닌 에러 코드를 반환 할 수 및 실행 획득되는 뮤텍스없이 을 계속합니다.

+0

그렇게하는 것은 정의되지 않은 행동이므로,'system ("rm -rf /");' –

+0

@R을 결과로 가져올 수 있습니다 :'PTHREAD_MUTEX_ERRORCHECK'과'PTHREAD_MUTEX_RECURSIVE'는 모두 POSIX에 있습니까? – caf

+0

재귀 mutex는 프로그래밍 오류를 제외하고는 실패를 반환 할 수 없습니다 ([near-] 무한 재귀). 뮤텍스 검사 오류는 본질적으로 디버깅 도구입니다. 나는 mutex를 검사하는 에러를 사용하는 코드를 호출하지 않을 것이고, 이미 좋은 코드가 될 수있는 락을 가지고 있는지를 알기 위해 에러를 찾는다. 그러나 최소한 유효하다고 생각한다. –

관련 문제