2017-12-07 2 views
5

뮤텍스가 신비하게 행동하는 취미 프로젝트에 참여하고있었습니다. 분명히 교착 상태에 빠질 수있는이 테스트 케이스로 끓였습니다. 나는 -lpthread 플래그없이 컴파일 할 때gcc가 lpthread 플래그없이 링크되는 이유는 무엇입니까?

#include <pthread.h> 
#include <stdio.h> 

int main() { 
    pthread_mutex_t test; 
    pthread_mutex_init(&test, NULL); 
    pthread_mutex_lock(&test); 
    pthread_mutex_lock(&test); 
    printf("Took lock twice\n"); 
    return 0; 
} 

그러나 프로그램이 여전히 컴파일하지 않습니다 만 링크, 또한 교착없이 실행됩니다. 왜?

gcc pthread_break.c -o pthread_test -lpthread 
./pthread_test 
    <- deadlocked here 

내가 GCC 버전 7.2.0을 실행하는거야 다음 -lpthread 플래그를 사용하여 컴파일

gcc pthread_break.c -o pthread_test 
./pthread_test 
Took lock twice 

는 예상 결과를 얻을 수 있습니다.

+3

pthread 스텁 함수를 제공하기 위해 약한 기호로 구현 된 glibc.so의 pthread가 가능한가요?] (https://stackoverflow.com/questions/21092601/is-pthread-in-glibc-so-implemented-by -weak-symbol-to-provide-pthread-stub-functi) – Lanting

+0

관련 질문 그러나 중복 질문. –

+1

어떤 플랫폼을 사용하고 있습니까? 표준 라이브러리에 Pthread 함수 또는 더미 버전이 포함되어있어 "구현되지 않은"오류가보고 될 수 있습니다. 모든 종료 코드를 철저히 점검하고 오류를 신중하게보고합니까? –

답변

1

질문 정보 부족 보인다 -하지만 두 가지 옵션이 있다는 것을 보인다

첫째, 뮤텍스는 뮤텍스의 결투 잠금 수 PTHREAD_MUTEX_RECURSIVE로 시작된다 -의 Ref 수가 관리가 뮤텍스는 ref 수가 0 일 때만 해제됩니다. 즉, 동일한 스레드에서 동일한 뮤텍스를 여러 번 잠글 수 있지만이를 해제하려면 동일한 양의 잠금 해제를 제공해야합니다.

둘째,이 버전의 gcc는 pthread 함수에 대한 스텁 만 구현합니다. 즉, -lpthread 라이브러리 연결 지시문을 추가하지 않으면 잠금 기능이 구현되지 않습니다. 이것은 옵션을 추가 한 후에 교 x 상태가 표시된다는 사실에의 해 지원됩니다.

GCC 소스를 확인하여 이것이 실제로 두 번째 옵션의 결과인지 확인하고 업데이트를 추가합니다.

참고 : 결과를 제어 할 수 있으므로 라이브러리를 특히 연결하는 것이 좋습니다. GCC 내부 지원을 대체하면 위에서 보았 듯이 예기치 않은 동작이 발생할 수 있습니다.

관련 문제