2010-01-24 92 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 与并行线程 库多线程增加了支持。此 选项为预处理器和链接器设置标志。