编译时 -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
运行您的构建,它将转储大量关于编译器前端实际传递给cc1plus
和ld
的参数的输出。
这里还有一个问题没有回答:不编译和链接 -pthread 标志是否有任何危险 - 即 -pthread 实际上做了什么?
@natenho -pthread
在不同的平台上做不同的事情,但所有这些都在某种程度上使 pthread 能够工作。因此,省略 -pthread
可能会导致 pthread 无法工作(或无法可靠地工作),或者对于已经启用了开箱即用的 pthread 支持的平台可能没有任何作用。【参考方案2】:
来自man gcc
:
-pthread 通过 pthreads 添加对多线程的支持 图书馆。这 选项为预处理器和链接器设置标志。
【讨论】:
我看到有人用-lpthread
代替,有什么区别?我们应该更喜欢-pthread
吗?
-pthread
暗示 -lpthread
,但反之则不然。 -pthread
因此是一个更完整的解决方案。以上是关于编译时 -pthread 标志的意义的主要内容,如果未能解决你的问题,请参考以下文章
提供“--isolatedModules”标志时无法编译命名空间