2010-01-24 96 views
116

在各種多線程C和C++項目中,我看到-pthread標誌適用於編譯和鏈接階段,而其他標誌根本不使用它,只是將-lpthread傳遞到鏈接階段。編譯時-pthread標誌的意義

是否有任何危險不編譯和鏈接-pthread標誌 - 即-pthread實際上做了什麼?我主要對Linux平臺感興趣。

回答

94

嘗試:

gcc -dumpspecs | grep pthread 

,並尋找任何與%{pthread:開始。

在我的電腦上,這導致文件編譯爲-D_REENTRANT,並鏈接到-lpthread。在其他平臺上,這可能會有所不同。大多數便攜性使用-pthread

在GNU libc上使用_REENTRANT可以改變某些libc頭文件的工作方式。作爲一個具體的例子,它使errno調用一個返回線程本地位置的函數。

+3

它可能不只是'errno'和一般的預處理。我不確定文章http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf在實踐中是否與海灣合作委員會優化有關,但我肯定對評論的深度印象深刻那裏。 – 2010-01-24 16:53:47

+2

我不認爲errno例子是正確的。即使沒有-pthread標誌或_REENTRANT定義,我的errno.h(glibc 2.10.1)和gcc(amd64上的4.4.1)爲errno處理生成一個動態調用,並且不會鏈接到符號地址。 – 2010-01-24 16:56:36

+0

@Andy:我在'/ usr/include'中爲'_REENTRANT'做了一個grep;我相信還有其他的例子。 – 2010-01-24 17:39:45

31

man gcc

-pthread 與並行線程 庫多線程增加了支持。此 選項爲預處理器和鏈接器設置標誌。