博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】多线程应用中pthread库使用问题
阅读量:6226 次
发布时间:2019-06-21

本文共 9781 字,大约阅读时间需要 32 分钟。


在 linux 下开发多线程应用,大多情况下我们都会使用 pthread (即 POSIX thread)这个库。该库遵循 POSIX.1-2001 标准。
 


在使用该库的过程中,肯定有人见过各种 gcc 选项配置方式:
 

  • -pthread
  • -pthreads
  • -lpthread
但应该有很多朋友没有搞清楚,这几种方式的区别和联系。本文的目的就在于此。
 


在 GCC man 手册中,我们可以找到如下内容
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
...
Machine Dependent Options
...
HPPA Options
...
       
-threads
           
Add support
for
multithreading with the dce thread library under HP-UX.  This option sets flags
for
both the preprocessor and linker.
...
IA-64 Options
...
       
-pthread
           
Add support
for
multithreading using the POSIX threads library.  This option sets flags
for
both the preprocessor and linker.  It does
           
not affect the thread safety of object code produced by the compiler or that of libraries supplied with it.  These are HP-UX specific flags.
...
IBM RS
/6000
and PowerPC Options
...
       
-pthread
           
Adds support
for
multithreading with the pthreads library.  This option sets flags
for
both the preprocessor and linker.
...
SPARC Options
...
       
-threads
           
Add support
for
multithreading using the Solaris threads library.  This option sets flags
for
both the preprocessor and linker. 
           
This option does not affect the thread safety of object code produced by the compiler or that of libraries supplied with it.
 
       
-pthreads
           
Add support
for
multithreading using the POSIX threads library.  This option sets flags
for
both the preprocessor and linker. 
           
This option does not affect the thread safety of object code produced  by the compiler or that of libraries supplied with it.
 
       
-pthread
           
This is a synonym
for
-pthreads.
...
可以看到,这几个选项都是 
Machine Dependent
 
的。而什么是 Machine Dependent ,则可以参考
 
 
 


还有以下内容
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
...
Options
for
Linking
...
       
-llibrary
       
-l library
           
Search the library named library when linking.  (The second alternative with the library as a separate argument is only
for
POSIX compliance and is not recommended.)
 
           
It makes a difference where
in
the
command
you write this option; the linker searches and processes libraries and object files
in
the order they are specified.  Thus, foo.o
           
-lz bar.o searches library z after
file
foo.o but before bar.o.  If bar.o refers to functions
in
z, those functions may not be loaded.
 
           
The linker searches a standard list of directories
for
the library,
which
is actually a
file
named liblibrary.a.  The linker
then
uses this
file
as
if
it had been specified
           
precisely by name.
 
           
The directories searched include several standard system directories plus any that you specify with -L.
 
           
Normally the files found this way are library files---archive files whose members are object files.  The linker handles an archive
file
by scanning through it
for
members
           
which
define symbols that have so far been referenced but not defined.  But
if
the
file
that is found is an ordinary object
file
, it is linked
in
the usual fashion.  The only
           
difference between using an -l option and specifying a
file
name is that -l surrounds library with lib and .a and searches several directories.
从 GCC 选项分类上,上面两种选项分别属于
 

GCC Command Options -> Hardware Models and Configurations -> xxx Options
 

GCC Command Options -> Options for Linking
 



而 -pthread 和 -pthreads 的关系可以简单认为,是在某一种 Hardware Model 上支持的同义选项
 


至于为何推荐使用 -pthread 选项,可以参考下图中的说明
 


 


下面实验验证一下,几种方式的效果
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
[root@Betty thread_test]
# uname -a
Linux Betty 2.6.32-358.el6.x86_64
#1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@Betty thread_test]
# gcc -V
gcc
: ‘-V’选项必须有一个参数
[root@Betty thread_test]
# gcc -v
使用内建 specs。
目标:x86_64-redhat-linux
配置为:..
/configure
--prefix=
/usr
--mandir=
/usr/share/man
--infodir=
/usr/share/info
--with-bugurl=http:
//bugzilla
.redhat.com
/bugzilla
--
enable
-bootstrap --
enable
-shared --
enable
-threads=posix --
enable
-checking=release --with-system-zlib --
enable
-__cxa_atexit --disable-libunwind-exceptions --
enable
-gnu-unique-object --
enable
-languages=c,c++,objc,obj-c++,java,fortran,ada --
enable
-java-awt=gtk --disable-dssi --with-java-home=
/usr/lib/jvm/java-1
.5.0-gcj-1.5.0.0
/jre
--
enable
-libgcj-multifile --
enable
-java-maintainer-mode --with-ecj-jar=
/usr/share/java/eclipse-ecj
.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
线程模型:posix
gcc
版本 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
[root@Betty thread_test]
#
[root@Betty thread_test]
#
[root@Betty thread_test]
# ll
总用量 5320
-rw-r--r-- 1 root root   45125 8月  20 09:24 event.h
lrwxrwxrwx 1 root root      21 8月  19 15:02 libevent-2.0.so.5 -> libevent-2.0.so.5.1.9
-rwxr-xr-x 1 root root  968698 8月  19 15:02 libevent-2.0.so.5.1.9
-rw-r--r-- 1 root root 1571978 8月  19 15:02 libevent.a
lrwxrwxrwx 1 root root      26 8月  19 15:02 libevent_core-2.0.so.5 -> libevent_core-2.0.so.5.1.9
-rwxr-xr-x 1 root root  585233 8月  19 15:02 libevent_core-2.0.so.5.1.9
-rw-r--r-- 1 root root  978626 8月  19 15:02 libevent_core.a
lrwxrwxrwx 1 root root      26 8月  19 15:02 libevent_core.so -> libevent_core-2.0.so.5.1.9
lrwxrwxrwx 1 root root      27 8月  19 15:02 libevent_extra-2.0.so.5 -> libevent_extra-2.0.so.5.1.9
-rwxr-xr-x 1 root root  404860 8月  19 15:02 libevent_extra-2.0.so.5.1.9
-rw-r--r-- 1 root root  593424 8月  19 15:02 libevent_extra.a
lrwxrwxrwx 1 root root      27 8月  19 15:02 libevent_extra.so -> libevent_extra-2.0.so.5.1.9
lrwxrwxrwx 1 root root      29 8月  19 15:02 libevent_openssl-2.0.so.5 -> libevent_openssl-2.0.so.5.1.9
-rwxr-xr-x 1 root root   94281 8月  19 15:02 libevent_openssl-2.0.so.5.1.9
-rw-r--r-- 1 root root  131932 8月  19 15:02 libevent_openssl.a
lrwxrwxrwx 1 root root      29 8月  19 15:02 libevent_openssl.so -> libevent_openssl-2.0.so.5.1.9
lrwxrwxrwx 1 root root      30 8月  19 15:02 libevent_pthreads-2.0.so.5 -> libevent_pthreads-2.0.so.5.1.9
-rwxr-xr-x 1 root root   18438 8月  19 15:02 libevent_pthreads-2.0.so.5.1.9
-rw-r--r-- 1 root root   18678 8月  19 15:02 libevent_pthreads.a
lrwxrwxrwx 1 root root      30 8月  19 15:02 libevent_pthreads.so -> libevent_pthreads-2.0.so.5.1.9
lrwxrwxrwx 1 root root      21 8月  19 15:02 libevent.so -> libevent-2.0.so.5.1.9
-rw-r--r-- 1 root root    9458 8月  20 09:24 thread.h
-rw-r--r-- 1 root root     757 8月  20 10:22 thread_test.c
[root@Betty thread_test]
#
[root@Betty thread_test]
#
[root@Betty thread_test]
# gcc thread_test.c -o thread_test_1 -levent_core -levent_pthreads -lpthread
[root@Betty thread_test]
# gcc thread_test.c -o thread_test_2 -levent_core -levent_pthreads -pthread 
[root@Betty thread_test]
# gcc thread_test.c -o thread_test_3 -levent_core -levent_pthreads -pthreads
gcc
: 无法识别的选项‘-pthreads’
[root@Betty thread_test]
#
[root@Betty thread_test]
# ll
总用量 5344
-rw-r--r-- 1 root root   45125 8月  20 09:24 event.h
lrwxrwxrwx 1 root root      21 8月  19 15:02 libevent-2.0.so.5 -> libevent-2.0.so.5.1.9
-rwxr-xr-x 1 root root  968698 8月  19 15:02 libevent-2.0.so.5.1.9
-rw-r--r-- 1 root root 1571978 8月  19 15:02 libevent.a
lrwxrwxrwx 1 root root      26 8月  19 15:02 libevent_core-2.0.so.5 -> libevent_core-2.0.so.5.1.9
-rwxr-xr-x 1 root root  585233 8月  19 15:02 libevent_core-2.0.so.5.1.9
-rw-r--r-- 1 root root  978626 8月  19 15:02 libevent_core.a
lrwxrwxrwx 1 root root      26 8月  19 15:02 libevent_core.so -> libevent_core-2.0.so.5.1.9
lrwxrwxrwx 1 root root      27 8月  19 15:02 libevent_extra-2.0.so.5 -> libevent_extra-2.0.so.5.1.9
-rwxr-xr-x 1 root root  404860 8月  19 15:02 libevent_extra-2.0.so.5.1.9
-rw-r--r-- 1 root root  593424 8月  19 15:02 libevent_extra.a
lrwxrwxrwx 1 root root      27 8月  19 15:02 libevent_extra.so -> libevent_extra-2.0.so.5.1.9
lrwxrwxrwx 1 root root      29 8月  19 15:02 libevent_openssl-2.0.so.5 -> libevent_openssl-2.0.so.5.1.9
-rwxr-xr-x 1 root root   94281 8月  19 15:02 libevent_openssl-2.0.so.5.1.9
-rw-r--r-- 1 root root  131932 8月  19 15:02 libevent_openssl.a
lrwxrwxrwx 1 root root      29 8月  19 15:02 libevent_openssl.so -> libevent_openssl-2.0.so.5.1.9
lrwxrwxrwx 1 root root      30 8月  19 15:02 libevent_pthreads-2.0.so.5 -> libevent_pthreads-2.0.so.5.1.9
-rwxr-xr-x 1 root root   18438 8月  19 15:02 libevent_pthreads-2.0.so.5.1.9
-rw-r--r-- 1 root root   18678 8月  19 15:02 libevent_pthreads.a
lrwxrwxrwx 1 root root      30 8月  19 15:02 libevent_pthreads.so -> libevent_pthreads-2.0.so.5.1.9
lrwxrwxrwx 1 root root      21 8月  19 15:02 libevent.so -> libevent-2.0.so.5.1.9
-rw-r--r-- 1 root root    9458 8月  20 09:24 thread.h
-rwxr-xr-x 1 root root    8008 8月  20 15:12 thread_test_1
-rwxr-xr-x 1 root root    8008 8月  20 15:12 thread_test_2
-rwxr-xr-x 1 root root    7976 8月  20 15:12 thread_test_3
-rw-r--r-- 1 root root     757 8月  20 10:22 thread_test.c
[root@Betty thread_test]
#
[root@Betty thread_test]
# ldd thread_test_*
thread_test_1:
        
linux-vdso.so.1 =>  (0x00007fff4a7ff000)
        
libevent_core-2.0.so.5 => not found
        
libevent_pthreads-2.0.so.5 => not found
        
libpthread.so.0 =>
/lib64/libpthread
.so.0 (0x000000388cc00000)
        
libc.so.6 =>
/lib64/libc
.so.6 (0x000000388c800000)
        
/lib64/ld-linux-x86-64
.so.2 (0x000000388c400000)
thread_test_2:
        
linux-vdso.so.1 =>  (0x00007fffbc3ff000)
        
libevent_core-2.0.so.5 => not found
        
libevent_pthreads-2.0.so.5 => not found
        
libpthread.so.0 =>
/lib64/libpthread
.so.0 (0x000000388cc00000)
        
libc.so.6 =>
/lib64/libc
.so.6 (0x000000388c800000)
        
/lib64/ld-linux-x86-64
.so.2 (0x000000388c400000)
thread_test_3:
        
linux-vdso.so.1 =>  (0x00007fffef754000)
        
libevent_core-2.0.so.5 => not found
        
libevent_pthreads-2.0.so.5 => not found
        
libc.so.6 =>
/lib64/libc
.so.6 (0x000000388c800000)
        
/lib64/ld-linux-x86-64
.so.2 (0x000000388c400000)
[root@Betty thread_test]
#
可以看到,从结果上讲,使用 -lpthread 和 -pthread 效果相同,而 -ptheads 不被支持。
 


最后,可以通过如下命令确认 libpthread 库属于哪个 rpm 包
 

1
2
[root@Betty thread_test]
# rpm -qf /lib64/libpthread.so.0
glibc-2.12-1.149.el6_6.9.x86_64

PS:上面的实验只是用于对于几种选项配置方式,实际上 libevent_pthreads.so 内部已经包含了 libpthread.so 。

转载地址:http://wlfna.baihongyu.com/

你可能感兴趣的文章
其实你还不懂word
查看>>
vcSA修改IP或hostname
查看>>
写给刚入行的新人和技术控们
查看>>
python运维开发之socket网络编程02
查看>>
每次访问都生成不一样sessionId
查看>>
vmware esxi安装linux启动在Starting udev 停止
查看>>
AIX下NFS共享设置
查看>>
sersync 实现数据实时同步镜像
查看>>
HibernateTemplate的原理与hibernate三态
查看>>
awk学习笔记(1) - 简介及入门
查看>>
盖茨解释乔布斯讨厌微软原因
查看>>
安装平台centos6.5 + oracle 11g
查看>>
zabbix服务端安装(LNMP)
查看>>
Nginx 反向代理缓存效果测试
查看>>
centos 零碎学习小记 6.
查看>>
手机视频技术
查看>>
每到星期一就很没有精神
查看>>
Windows Server 2012 RDS系列:桌面虚拟化(4)
查看>>
分割超大Redis数据库例子
查看>>
apue.h源代码
查看>>