编译时-pthread标志的重要性

lee*_*roy 138 c c++ linux pthreads

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

有没有危险没有编译和链接-pthread国旗 - 即-pthread实际做什么?我主要对Linux平台感兴趣.

Chr*_*ung 105

尝试:

gcc -dumpspecs | grep pthread
Run Code Online (Sandbox Code Playgroud)

并寻找任何开头的东西%{pthread:.

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

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

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

Dmi*_*try 37

来自man gcc:

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

  • 我看到有些人用“-lpthread”代替,有什么区别?我们应该更喜欢“-pthread”吗? (2认同)
  • “-pthread”意味着“-lpthread”,但反之则不然。因此,“-pthread”是一个更完整的解决方案。 (2认同)