在各种多线程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