【发布时间】:2011-01-08 19:49:33
【问题描述】:
在各种多线程 C 和 C++ 项目中,我看到 -pthread 标志应用于编译和链接阶段,而其他人根本不使用它,只是将 -lpthread 传递给链接阶段。
不编译和链接-pthread标志是否有任何危险-即-pthread实际上做了什么?我主要对 Linux 平台感兴趣。
【问题讨论】:
在各种多线程 C 和 C++ 项目中,我看到 -pthread 标志应用于编译和链接阶段,而其他人根本不使用它,只是将 -lpthread 传递给链接阶段。
不编译和链接-pthread标志是否有任何危险-即-pthread实际上做了什么?我主要对 Linux 平台感兴趣。
【问题讨论】:
试试:
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 优化的相关性如何,但我确实对那里的评论深度印象深刻。
-D_REENTRANT 或 -pthread。使用g++ -v 运行您的构建,它将转储大量关于编译器前端实际传递给cc1plus 和ld 的参数的输出。
-pthread 在不同的平台上做不同的事情,但所有这些都在某种程度上使 pthread 能够工作。因此,省略 -pthread 可能会导致 pthread 无法工作(或无法可靠地工作),或者对于已经启用了开箱即用的 pthread 支持的平台可能没有任何作用。
来自man gcc:
-pthread 通过 pthreads 添加对多线程的支持 图书馆。这 选项为预处理器和链接器设置标志。
【讨论】:
-lpthread代替,有什么区别?我们应该更喜欢-pthread吗?
-pthread 暗示 -lpthread,但反之则不然。 -pthread 因此是一个更完整的解决方案。