컴파일 할 때 -pthread 플래그의 의미


143

다양한 멀티 스레드 C 및 C ++ 프로젝트에서 -pthread플래그는 컴파일 및 연결 단계 모두에 적용되는 반면 다른 사람들은 전혀 사용하지 않고 -lpthread연결 단계로 전달 됩니다.

컴파일 및 -pthread플래그 와 연결되지 않은 위험 -pthread이 있습니까? 즉 실제로 무엇을합니까? 저는 주로 Linux 플랫폼에 관심이 있습니다.

답변:


107

시험:

gcc -dumpspecs | grep pthread

로 시작하는 것을 찾으십시오 %{pthread:.

내 컴퓨터에서 파일이로 컴파일 -D_REENTRANT되고에 링크됩니다 -lpthread. 다른 플랫폼에서는 다를 수 있습니다. -pthread대부분의 이식성을 위해 사용하십시오 .

_REENTRANTGNU libc에서을 사용하면 일부 libc 헤더의 작동 방식이 변경됩니다. 구체적인 예로 errno스레드 로컬 위치를 반환하는 함수 를 호출합니다.


3
errno일반적으로 전처리 만하 는 것은 아닙니다 . gcc 최적화와 관련하여 hpl.hp.com/techreports/2004/HPL-2004-209.pdf 문서 가 실제로 어떤 관련이 있는지 잘 모르겠지만 , 검토의 깊이에 깊은 인상을 받았습니다.
Pascal Cuoq 2016 년

2
나는 errno 예제가 맞지 않다고 생각합니다. -pthread 플래그 또는 _REENTRANT 정의가 없어도 my errno.h (glibc 2.10.1) 및 gcc (md64의 4.4.1)는 errno 처리를위한 동적 호출을 생성하며 심볼 주소와 연결되지 않습니다.
Andy Ross

1
@ 파스칼 : 링크 주셔서 감사합니다. 지금은 머리 위로 약간 올라가지 만 핵심은 스레딩을 "고정"할 수 없으며 대신 메모리 모델의 일부로 디자인해야한다는 것입니다. 나는 그것에 완전히 동의합니다.
Chris Jester-Young

2
@Andy-귀하의 gcc 버전은 자동 -D_REENTRANT또는 -pthread자동으로 제공 될 수 있습니다 . 당신의 빌드를 실행 g++ -v하고 그것은 컴파일러 프론트 엔드는 사실에 통과 어떤 매개 변수에 대한 출력의 많은 덤프 cc1plusld.
Tom

3
아직 대답하지 않은 질문이 있습니다. -pthread 플래그로 컴파일 및 링크하지 않을 위험이 있습니까? -pthread가 실제로 무엇을합니까?
natenho

40

보낸 사람 man gcc:

-pthread pthreads 라이브러리를 통한 멀티 스레딩 지원을 추가합니다. 이 옵션은 전처리 기와 링커 모두에 플래그를 설정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.