2011-09-14 7 views
8

이 호출이 실패합니다 같은 스레드에서 pthread_mutex_unlock 것을 여전히 가능, 스레드가 성공적으로 pthread_mutex_lock 전화 가정? 그렇다면이 외에 스레드를 중단에 대해, 당신은 실제로 뭔가를 할 수 있습니까?pthread_mutex_unlock 실패를 어떻게 처리합니까?

if(pthread_mutex_lock(&m) == 0) 
{ 
    // got the lock, let's do some work 

    if(pthread_mutex_unlock(&m) != 0) // can this really fail? 
    { 
     // ok, we have a lock but can't unlock it? 
    } 
} 

this page에서 pthread_mutex_unlock() 가능한 오류는 :

[EINVAL] 뮤텍스에 의해 지정된 값이 초기화 뮤텍스 객체를 참조하지 않는다 .

잠금 후 성공하면이 실패 할 가능성이 있습니다.

[EAGAIN] 뮤텍스 잠금 재귀의 최대 수를 초과했기 때문에 뮤텍스를 취득 할 수 없습니다 .

정말? 잠금 해제?

pthread_mutex_unlock() 함수는 다음 경우에 실패 할 수 있습니다.

[EPERM] 현재 스레드가 mutex를 소유하지 않습니다.

다시 잠금이 성공하면 다시 발생하지 않아야합니다.

내 생각에 성공적인 잠금이 있다면이 상황에서 잠금을 해제하면 오류 검사와 후속 처리 코드를 무의미하게 만들 수 없습니다.

답변

2

:

당신이 사람이 페이지를 믿는다면
The pthread_mutex_unlock() function may fail if: 

EPERM 
The current thread does not own the mutex. 

These functions shall not return an error code of [EINTR]. 

, 당신의 오류 사건이 일어날 수없는 것으로 보인다. 당신이 "승리"를 부르짖 음 전에

+0

감사를 요구하고 있지만 당신의 이론은, 스트레스라고 할 수 있습니다. 나는 왜 내가 묻고 있는지 명확하게하기 위해 질문을 업데이트했다. 내가 대답을 수락하기 전에 다른 입력을 얻을 수 있는지 확인하고 싶습니다. –

2

. 내 프로그램 중 하나가 (HP-UX가 아닌 리눅스)를 pthread_mutex_unlock에 실패한 이유를 나는 이유를 찾고이 페이지에 끝났다.

if (pthread_mutex_unlock(&mutex) != 0) 
    throw YpException("unlock %s failed: %s", what.c_str(), strerror(errno)); 

많은 실패를 저질렀다. 난 그냥 지금은 errno를 확인하지 않을 것을 발견, 오히려 반환 값 있지만 의 errno는 EINTR했다. 그럼에도 불구하고 반환 값은 0이 아니 었습니다. 그리고 그 자리에서 유효한 자물쇠를 소유하고 있음을 수학적으로 증명할 수 있습니다.

그래서 그뿐만 아니라 거의 내 생각이야, 그냥 더 많은 연구가 ;-)

+0

굉장! 또는 아마 굉장하지 않습니다. :-) 이것은 정확히 제가 찾고있는 피드백의 종류입니다. 이 오류를 재현 할 수 있습니까 아니면 한 번일까요? 'pthread_mutex_unlock()'이'errno' 나'EINTR'에서'EINTR'을 반환하지 않았기 때문에 실제 반환 값이 무엇인지 알면 흥미로울 것입니다. –

+0

재현 할 수 없었습니다.errno 대신 실제 반환 값을 표시하도록 로깅을 수정했습니다. 다음 번에 그런 일이 생길 것입니다 (나는 희망하지 않습니다). 정확히 무엇인지 알려 드리겠습니다. ;-) – geert3

+2

약간의 업데이트 : 실패한 잠금 해제가 발생했습니다. 반환 값 == 1입니다. "소유자가 아닙니다"라는 의미입니다. 이것은 매우 미묘한 버그로 밝혀졌습니다. 내 모든 자물쇠를 객체로 포장합니다 (소멸자 잠금 해제). 이것은 잠금 장치가 객체의 범위와 함께 자동으로 끝나기 때문에 편리합니다. 이 함수에서 thread_exit()를 호출했습니다. 맨 페이지는 thread_exit() 이후에 자동 변수를 사용할 수 없다고 말합니다. 정확히 내 잠금 랩핑 객체의 소멸자가 수행 한 것입니다 (암시 적으로 AFTER thread_exit라고 함). – geert3

관련 문제