[multithreading] 컴파일하는 동안 -pthread와 -lpthread의 차이점

의 차이 무엇입니까 gcc -pthreadgcc -lpthread멀티 스레드 프로그램을 컴파일하는 동안 사용됩니까?



답변

-pthread 컴파일러에게 pthread 라이브러리에서 링크하고 스레드에 대한 컴파일을 구성하도록 지시합니다.

예를 들어 다음은 -pthreadUbuntu 컴퓨터에 설치된 GCC 패키지 에서 옵션이 사용될 때 정의되는 매크로를 보여줍니다 .

$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc          -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1

-lpthread옵션을 사용하면 pthread 라이브러리가 연결될뿐입니다. 미리 정의 된 매크로는 정의되지 않습니다.

결론 : -pthread옵션을 사용해야합니다 .


참고 :이 -pthread옵션은 GCC 문서에서 플랫폼 별 옵션으로 문서화되어 있으므로 항상 사용할 수있는 것은 아닙니다. 그러나 GCC 문서에 명시 적으로 나열되지 않은 플랫폼 (예 : i386 및 x86-64)에서 사용할 수 있습니다. 사용 가능한 경우 사용해야합니다.

또한 -pthreads( -pthreadSolaris 2에 대한 동의어로 나열 됨 ) 및 -mthread(i386 및 x86-64 Windows에서 MinGW 특정 스레드 지원용 )과 같은 다른 유사한 옵션이 GCC에서 사용되었습니다 . 내 이해는 GCC가 -pthread앞으로 균일하게 사용하려고 노력하고 있다는 것입니다.


답변

-pthreadpthreads 라이브러리로 멀티 스레딩 지원을 추가합니다. 이 옵션은 전처리 기와 링커 ( man gcc) 모두에 대한 플래그를 설정합니다 .

동안

-lpthread 링크하는 동안 존재하는 것은 전처리 중에 영향을 미치지 않습니다.


답변

허용되는 대답이 있지만 IMO는 충분한 컨텍스트와 통찰력을 제공하지 않습니다. 따라서이 추가 답변.


-lpthread 더 이상 존재하지 않는 문제에 대한 해결책입니다 (~ 2005 년 이후).

예전에는 LinuxThreads 와 같이 POSIX와 호환되지 않는 Pthreads API 의 독점적 구현이있었습니다 . POSIX 표준은 단순히 POSIX 호환 동작을 원한다면 Pthreads API의 POSIX 호환 구현을 링크하는 데 필요한 링크 및 링크가 필요하다고 말합니다 .-lpthread

최신 운영 체제에는 Pthreads API의 다중 구현이 없습니다. 그리고 그것이 -lpthread더 이상 어떤 목적도 제공하지 않는 이유 입니다.


컴파일러와 같은 gccclang(와, 아마, 리눅스 호환 컴파일러)가 필요 하여 -pthread모두 컴파일하고 POSIX 호환 멀티 스레드 애플리케이션을 연결하고 하나는 사용해야합니다 무엇에 대한 명령 줄 옵션을.

컴파일 시간에 -pthread옵션은 Pthread API가 요청되었음을 명시하고 (예 : Solaris Threads와 같은 다중 스레딩 API가있을 수 있음) 플랫폼 별 매크로를 정의합니다 ( _REENTRANTLinux에서 , _MTSolaris에서).

링크 타임에 -pthreadPOSIX 호환 Pthreads API 동작을 구현하는 필수 라이브러리 (있는 경우)의 링크.

위의 내용은 왜 -lpthread필요하지도 충분하지도 않은지 명확하게 보여줍니다 .


답변