-pthread标志在编译时的意义


143

在各种多线程C和C ++项目中,我已经看到该-pthread标志同时应用于编译和链接阶段,而其他人则根本不使用它,而只是-lpthread转到链接阶段。

有没有编译和链接-pthread标志的危险-即-pthread实际上是做什么的?我主要对Linux平台感兴趣。

Answers:


107

尝试:

gcc -dumpspecs | grep pthread

并寻找任何以 %{pthread:。。

在我的计算机上,这导致使用编译文件-D_REENTRANT并与链接-lpthread。在其他平台上,这可能有所不同。使用-pthread于大多数便携性。

_REENTRANT在GNU libc上使用,可以更改某些libc标头的工作方式。作为一个具体示例,它使errno调用函数返回线程本地位置。


3
errno一般而言,可能不只是预处理。我不确定hpl.hp.com/techreports/2004/HPL-2004-209.pdf对于gcc优化在实践中有多重要,但是我对那里的评论深度印象深刻。
Pascal Cuoq 2010年

2
我认为errno示例不正确。即使没有-pthread标志或_REENTRANT定义,我的errno.h(glibc 2.10.1)和gcc(在amd64上为4.4.1)也会为errno处理生成动态调用,并且不会链接到符号地址。
安迪·罗斯

1
@Pascal:感谢您的链接。目前,它有点超出我的头了,但是似乎中心点是不能仅仅“固定”线程,而必须将其设计为内存模型的一部分。我完全同意。
克里斯·杰斯特·杨

2
@Andy-您的gcc版本可能是提供-D_REENTRANT-pthread自动提供的。使用运行您的构建,g++ -v它将转储有关编译器前端实际传递给cc1plusand的参数的大量输出ld
汤姆(Tom)2010年

3
这里仍然没有回答一个问题:如果不编译-pthread标志并将其与-pthread标志链接,是否存在任何危险-即-pthread实际上是做什么的?
natenho 2015年

40

来自man gcc

-pthread使用pthreads库添加了对多线程的支持。该选项为预处理器和链接器设置标志。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.