gcc 参数:-pthread。它有什么作用?

Don*_*nic 1 multithreading gcc pthreads compiler-flags

我开始在 Debian 8 下使用 gcc 进行多线程编程。我已经成功编写并运行了一个多线程测试应用程序 (foobar.c),但我对 Makefile 感到困惑(从示例中复制)。特别是,有效的命令是

gcc foobar.c -o foobar -pthread
Run Code Online (Sandbox Code Playgroud)

我对“-pthread”感到困惑。就是它

(a) 值为“thread”的选项“-p”,或
(b) 参数“-pthread”?

如果是任何一种情况,它实际上在做什么?包括一些图书馆?包括一些对象?设置其他选项?

顺便说一句 - 一个类似的问题15929739被问到但从未得到回答。问题20924412也没有帮助。

Jon*_*art 5

手册页

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

具体来说,从 GCC 6.2.1 开始,-pthread将:

  • #define _REENTRANT 1
  • 添加-lpthread到链接反对libpthread

你问我怎么知道这个?

添加了哪些预处理器标志?

让我们转储预处理器定义并比较它们:

$ diff <(gcc -dM -E - < /dev/null) <(gcc -pthread -dM -E - < /dev/null)
> #define _REENTRANT 1
Run Code Online (Sandbox Code Playgroud)

添加了哪些链接器选项?

让我们转储 GCC 传递的 ld 选项并比较它们:

diff <(gcc -### -o foo empty.c 2>&1) <(gcc -### -pthread -o foo empty.c 2>&1)
Run Code Online (Sandbox Code Playgroud)

这里的输出有点冗长,但如果我们忽略临时文件名差异,我们会发现:

  • -lpthread
  • "-plugin-opt=-pass-through=-lpthread"