2011-06-07 30 views
11

我有一個問題:如果我們有一個應用程序,它不使用線程,我們可以通過兩種方式鏈接它:鏈接'-lpthread`會改變應用程序行爲嗎? (Linux操作系統,Glibc的)

1)鏈接像往常一樣,沒有-lpthread-ldl

2 )添加到鏈接兩個庫:libpthread和libdl。

E.g.

$ cat a.c 
int main(){printf("Hehe");} 
$ gcc a.c -w -o a 
$ gcc a.c -w -o a1 -ldl -lpthread 

默認情況下,這兩個庫是動態鏈接:

$ ldd a 
    linux-gate.so.1 
    libc.so.6 
    /lib/ld-linux.so.2 
$ ldd a1 
    linux-gate.so.1 
    libdl.so.2 
    libpthread.so.0 
    libc.so.6 
    /lib/ld-linux.so.2 

多大的差別將在那裏a版本和版本a1之間?在應用程序本身和int glibc中,以什麼方式工作? pthreads的鏈接是否將線程不安全變爲線程安全算法?

E.g.

$ strace ./a 2>&1 |wc -l 
    73 
$ strace ./a1 2>&1 |wc -l 
    103 

在A1中跟蹤,兩個附加的庫加載,一些更mprotect s的調用,並且加入的部分:

set_tid_address; set_robust_list; rt_sigaction x 2; rt_sigprocmask; getrlimit; uname 

回答

14

的glibc本身包含用於許多pthread函數存根代碼。這些glibc pthread函數什麼都不做。但是,當程序與libpthread鏈接時,那些存根被替換爲真正的pthread鎖定函數。

這是爲了在需要線程安全但不自己使用線程的庫中使用。這些庫可以使用pthread鎖,但只有在鏈接到libpthread的程序或庫被加載時纔會真正發生這些鎖。

+0

當pthread被鏈接時,哪些存根被改變? – osgx 2011-06-07 15:00:26

+2

@osgx:http://www.ohloh.net/p/libpthread-stubs – 2011-06-08 00:16:09

相關問題