Multithreading 编译时-pthread和-lpthread之间的差异

Multithreading 编译时-pthread和-lpthread之间的差异,multithreading,gcc,thread-safety,pthreads,compiler-flags,Multithreading,Gcc,Thread Safety,Pthreads,Compiler Flags,编译多线程程序时使用的gcc-pthread和gcc-lpthread之间有什么区别?-pthread告诉编译器链接pthread库并配置线程编译 例如,下面显示了在我的Ubuntu机器上安装的GCC包上使用-pthread选项时定义的宏: $ gcc -pthread -E -dM test.c > dm.pthread.txt $ gcc -E -dM test.c > dm.nopthread.txt $ diff dm.pthread.txt dm.nopt

编译多线程程序时使用的
gcc-pthread
gcc-lpthread
之间有什么区别?

-pthread
告诉编译器链接pthread库并配置线程编译

例如,下面显示了在我的Ubuntu机器上安装的GCC包上使用
-pthread
选项时定义的宏:

$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc          -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt 
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1
$gcc-pthread-E-dM test.c>dM.pthread.txt
$gcc-E-dM test.c>dM.nopthread.txt
$diff dm.pthread.txt dm.nopthread.txt
152d151
<#定义_可重入1
208d206
<#定义uu使用u可重入1
使用
-lpthread
选项只会导致链接pthread库-预定义的宏不会被定义

底线:您应该使用
-pthread
选项


注意:
-pthread
选项作为特定于平台的选项记录在GCC文档中,因此它可能并不总是可用的。但是,它可以在GCC文档没有明确列出它的平台上使用(如i386和x86-64)——您应该在可用时使用它


还请注意,GCC使用了其他类似选项,例如
-pthreads
(在Solaris 2上作为
-pthread
的同义词列出)和
-mthread
(用于i386和x86-64 Windows上特定于MinGW的线程支持)。我的理解是,GCC正试图继续统一使用
-pthread

-pthread
告诉编译器在pthread库中链接并配置线程编译

例如,下面显示了在我的Ubuntu机器上安装的GCC包上使用
-pthread
选项时定义的宏:

$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc          -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt 
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1
$gcc-pthread-E-dM test.c>dM.pthread.txt
$gcc-E-dM test.c>dM.nopthread.txt
$diff dm.pthread.txt dm.nopthread.txt
152d151
<#定义_可重入1
208d206
<#定义uu使用u可重入1
使用
-lpthread
选项只会导致链接pthread库-预定义的宏不会被定义

底线:您应该使用
-pthread
选项


注意:
-pthread
选项作为特定于平台的选项记录在GCC文档中,因此它可能并不总是可用的。但是,它可以在GCC文档没有明确列出它的平台上使用(如i386和x86-64)——您应该在可用时使用它


还请注意,GCC使用了其他类似选项,例如
-pthreads
(在Solaris 2上作为
-pthread
的同义词列出)和
-mthread
(用于i386和x86-64 Windows上特定于MinGW的线程支持)。我的理解是,GCC正试图继续统一使用
-pthread

-pthread
增加了对pthreads库中多线程的支持。此选项为预处理器和链接器设置标志(
mangcc


-lpthread
在链接时存在,预处理时不会产生任何影响。

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


-lpthread
在链接时存在,预处理时不会产生任何影响。

有一个公认的答案,但在我看来,它没有提供足够的上下文和洞察力。因此有了这个额外的答案


-lpthread
是一种针对不再存在的问题的解决方案(自~2005年起)

在过去,有一些专有的实现与POSIX不兼容,比如。POSIX标准只是说,如果想要POSIX兼容的行为,那么必须链接到
-lpthread
,并且链接到Pthreads API的POSIX兼容实现所需的链接,应该有很多实现

现代操作系统中没有pthreadsapi的多个实现。这就是为什么
-lpthread
不再起任何作用的原因


gcc
clang
(可能还有所有Linux兼容的编译器)这样的编译器需要使用
-pthread
命令行选项来编译和链接与POSIX兼容的多线程应用程序,这是必须使用的

在编译时,
-pthread
选项表明请求pthread API(可以有多个线程API,例如Solaris线程),并定义特定于平台的宏(,
\u MT

在链接时,
-pthread
在实现符合POSIX的Pthreads API行为的所需库(如果有)中链接


以上说明了为什么
-lpthread
既不必要也不充分。

有一个公认的答案,但在我看来,它没有提供足够的背景和见解。因此有了这个额外的答案


-lpthread
是一种针对不再存在的问题的解决方案(自~2005年起)

在过去,有一些专有的实现与POSIX不兼容,比如。POSIX标准只是说,如果想要POSIX兼容的行为,那么必须链接到
-lpthread
,并且链接到Pthreads API的POSIX兼容实现所需的链接,应该有很多实现

现代操作系统中没有pthreadsapi的多个实现。这就是为什么
-lpthread
不再起任何作用的原因


类似于
gcc
clang
(可能还有所有与Linux兼容的编译器)的编译器需要使用
-pthread
命令行选项进行编译和链接