编译时 -pthread 标志的意义

Posted

技术标签:

【中文标题】编译时 -pthread 标志的意义【英文标题】:Significance of -pthread flag when compiling 【发布时间】:2011-01-08 19:49:33 【问题描述】:

在各种多线程 C 和 C++ 项目中,我看到 -pthread 标志应用于编译和链接阶段,而其他人根本不使用它,只是将 -lpthread 传递给链接阶段。

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

【问题讨论】:

【参考方案1】:

试试:

gcc -dumpspecs | grep pthread

并查找以%pthread: 开头的任何内容。

在我的计算机上,这会导致文件使用-D_REENTRANT 编译,并与-lpthread 链接。在其他平台上,这可能会有所不同。使用-pthread 以获得最大的可移植性。

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

【讨论】:

它可能不仅仅是errno 和一般的预处理。我不确定hpl.hp.com/techreports/2004/HPL-2004-209.pdf 文章在实践中与 gcc 优化的相关性如何,但我确实对那里的评论深度印象深刻。 我认为 errno 示例不正确。即使没有 -pthread 标志或 _REENTRANT 定义,我的 errno.h(glibc 2.10.1)和 gcc(amd64 上的 4.4.1)也会生成对 errno 处理的动态调用,并且不会链接到符号地址。 @Andy - 你的 gcc 版本可能会自动提供 -D_REENTRANT-pthread。使用g++ -v 运行您的构建,它将转储大量关于编译器前端实际传递给cc1plusld 的参数的输出。 这里还有一个问题没有回答:不编译和链接 -pthread 标志是否有任何危险 - 即 -pthread 实际上做了什么? @natenho -pthread 在不同的平台上做不同的事情,但所有这些都在某种程度上使 pthread 能够工作。因此,省略 -pthread 可能会导致 pthread 无法工作(或无法可靠地工作),或者对于已经启用了开箱即用的 pthread 支持的平台可能没有任何作用。【参考方案2】:

来自man gcc

-pthread 通过 pthreads 添加对多线程的支持 图书馆。这 选项为预处理器和链接器设置标志。

【讨论】:

我看到有人用-lpthread代替,有什么区别?我们应该更喜欢-pthread吗? -pthread 暗示 -lpthread,但反之则不然。 -pthread 因此是一个更完整的解决方案。

以上是关于编译时 -pthread 标志的意义的主要内容,如果未能解决你的问题,请参考以下文章

运行 make 时附加编译器标志

-g 标志更改程序的运行时和编译

在 GCC 中编译时使用 `-Wextra` 标志的缺点

提供“--isolatedModules”标志时无法编译命名空间

使用 pyximport 时如何设置 Cython 编译器标志?

在配置/制作时将编译标志附加到 CFLAGS 和 CXXFLAGS