编译时使用-pthread标志的意义

169
在许多多线程的C和C++项目中,我看到在编译和链接阶段都使用了-pthread标志,而其他一些则根本不使用它,只是在链接阶段传递-lpthread
没有使用-pthread标志进行编译和链接是否存在任何危险?也就是说,-pthread实际上是做什么的?我主要关心Linux平台。
2个回答

124

尝试:

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 在实践中对于 gcc 优化有多大的相关性,但我印象深刻的是那里进行的审查的深度。 - Pascal Cuoq
2
我认为errno的例子是不正确的。即使没有-pthread标志或_REENTRANT定义,我的errno.h(glibc 2.10.1)和gcc(在amd64上的4.4.1)生成一个动态调用来处理errno并且不会链接到符号地址。 - Andy Ross
2
@Andy - 你的gcc版本可能已经自动提供了-D_REENTRANT-pthread。使用g++ -v运行你的构建,它会输出大量关于编译器前端实际传递给cc1plusld的参数信息。 - Tom
4
这里仍有一个未回答的问题:如果不使用-pthread标志进行编译和链接,是否存在任何危险 - 即pthread实际上是做什么的? - natenho
2
@natenho -pthread 在不同的平台上有不同的作用,但它们都以某种方式使 pthreads 能够工作。因此,省略 -pthread 可能会导致 pthreads 无法工作(或者不可靠地工作),或者对于已经开箱即用支持 pthreads 的平台可能没有任何影响。 - C. K. Young
显示剩余5条评论

47

来自 man gcc:

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


2
我看到有些人使用-lpthread,那有什么区别呢?我们应该优先选择-pthread吗? - Paris Qian Sen
2
-pthread 意味着 -lpthread,但反之则不然。因此,-pthread 是一个更完整的解决方案。 - Victor Paléologue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接