在各種多線程C和C++項目中,我看到-pthread
標誌適用於編譯和鏈接階段,而其他標誌根本不使用它,只是將-lpthread
傳遞到鏈接階段。編譯時-pthread標誌的意義
是否有任何危險不編譯和鏈接-pthread
標誌 - 即-pthread
實際上做了什麼?我主要對Linux平臺感興趣。
在各種多線程C和C++項目中,我看到-pthread
標誌適用於編譯和鏈接階段,而其他標誌根本不使用它,只是將-lpthread
傳遞到鏈接階段。編譯時-pthread標誌的意義
是否有任何危險不編譯和鏈接-pthread
標誌 - 即-pthread
實際上做了什麼?我主要對Linux平臺感興趣。
嘗試:
gcc -dumpspecs | grep pthread
,並尋找任何與%{pthread:
開始。
在我的電腦上,這導致文件編譯爲-D_REENTRANT
,並鏈接到-lpthread
。在其他平臺上,這可能會有所不同。大多數便攜性使用-pthread
。
在GNU libc上使用_REENTRANT
可以改變某些libc頭文件的工作方式。作爲一個具體的例子,它使errno
調用一個返回線程本地位置的函數。
從man gcc
:
-pthread 與並行線程 庫多線程增加了支持。此 選項爲預處理器和鏈接器設置標誌。
它可能不只是'errno'和一般的預處理。我不確定文章http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf在實踐中是否與海灣合作委員會優化有關,但我肯定對評論的深度印象深刻那裏。 – 2010-01-24 16:53:47
我不認爲errno例子是正確的。即使沒有-pthread標誌或_REENTRANT定義,我的errno.h(glibc 2.10.1)和gcc(amd64上的4.4.1)爲errno處理生成一個動態調用,並且不會鏈接到符號地址。 – 2010-01-24 16:56:36
@Andy:我在'/ usr/include'中爲'_REENTRANT'做了一個grep;我相信還有其他的例子。 – 2010-01-24 17:39:45