2011-04-19 4 views
2

최근에 나는 올바른 코드에 작은 값을 가지는 디버깅 도구로 주로 오류 검사 뮤텍스를 고려,하지만 나는 그들이 같이 그들이 재귀 뮤텍스를 대체 할 수있는 속성이 실현 될 때까지 :재귀 또는 오류 검사 뮤텍스?

void foo() 
{ 
    int ok_to_unlock = !pthread_mutex_lock(m); 
    /* do something */ 
    if (ok_to_unlock) pthread_mutex_unlock(m); 
} 

pthread_mutex_lock 그 성공시 0을 반환하고 호출자가 이미 잠금을 보유하고있는 경우 EDEADLK을 반환합니다. 이 사용법에는 임의의 재귀 적 잠금 제한을 초과 할 필요가 없다는 이점이 있습니다. "잠금 횟수"는 호출 프레임에 함축되어 있습니다. 원칙적으로이 관용구는 호출 스레드가 이미 잠금을 유지했을 때 pthread_mutex_unlock에 대한 함수 호출이 수행되지 않으므로 약간 더 나은 성능을 보입니다.

내 질문에 대한 스타일은 주로 다음과 같습니다. 코드의 선명도를 떨어 뜨리는 오류 검사 뮤텍스를 사용합니까? 이런 식으로 사용하고 싶지 않은 다른 이유가 있습니까?

+0

매우 주관적인 것처럼 들립니다. :) – unwind

+0

나는 가정한다. 마지막 문장의 질문은 비 주관적인 생각 일뿐입니다 (스타일이 아닌 이유로이 사용법은 나쁠 것입니다). –

+0

스타일 외에도 PTHREAD_MUTEX_ERRORCHECK의 성능을 조사 할 것입니다. pthread_mutex_xxx 호출을 몇 개 저장하면 에러 체크 뮤텍스가 나온다면 가치가 없을 수도 있습니다. 보통 또는 재귀 뮤텍스보다 10 배 느림 – nos

답변

2

이것은 주관적이지만 코드가 명확하지 않다고 생각합니다.

+0

동의 - 향후 유지 보수 담당자가 프로그램의 잠금에 의해 "오류"가 반환되는 이유를 올바로 물을 수 있습니다. 또한 동시 프로그램의 정확성을 검사하기 위해 공식화 된 도구는 없습니다. –

1

성능 향상이 무엇이든간에 처음에는 오류 검사 뮤텍스를 사용하는 데 드는 비용이 줄어들 것이라고 생각합니다. 그러나 이러한 비용조차도 작을 가능성이 있으며이 관용구를 사용하지 않을 이유가 없습니다. 내 유일한 의견은 ok_to_unlock 대신 locked과 같은 변수 이름을 사용하는 것입니다. pthread_mutex_lock 반환 성공 에 0EDEADLK 호출자가 이미 잠금을 보유하면 것을

+1

'잠긴'문제는 mutex *가 어느쪽으로 든 잠겨 있다는 것입니다. 변수는 누가 잠금을 해제 할 책임이 있는지 (당사 또는 발신자) 나타냅니다. 당신이 무엇을 부르더라도 mutex가 우리가 올 때까지 잠겨 있지 않으면 변수는 true이고 이미 잠긴 경우 false입니다. –

+2

'!'를'if'로 옮기고'locked_by_caller'의 경우 이름을 ... –

2

참고. EDEADLK하지 리턴 될 수있는 유일한 가능한 오류 때문에 게시 된

코드는 완전히 견고하지 않습니다. 뮤텍스가 제대로 초기화되지 않은 경우 EINVAL도 있습니다.

David Butenhof는 재귀 뮤텍스 사용에 대해 약간의 interesting warnings을 가지고 있습니다.

+0

초기화되지 않은 뮤텍스를 사용하면 UB가됩니다. 따라서이 경우를 설명 할 필요가 없습니다. –

+0

+1 링크입니다. 재미있는 역사. 필자는 stdio locking과 flockfile이 어떻게 작동 하는지를 이해할 때까지이 관점에 동의했습니다. 이것은 재귀 뮤텍스 유형입니다.그런 다음 재귀 뮤텍스를 사용하면 데이터 조작의 가장 작은 단위를 보호하면서 호출자가 더 큰 단위의 데이터 조작을 원할하게 할 수 있음을 알게되었습니다. 즉, stdio의 경우 파일 단위 IO 작업이 원자 단위로 이루어 지도록 보장합니다. –