2011-06-07 12 views
11

Bir sorum var: Biz hiçbir konuları kullanan bir uygulama varsa, biz iki şekilde bağlayabilirsiniz: zamanki gibiBir `-lpthread 'bağlanırken uygulama davranışı değişir mi? (Linux, Glibc)

1) Linki, -lpthread ve -ldl

2 olmadan) Bağlantıyı iki kütüphaneye ekleyin: libpthread ve libdl.

E.g. Varsayılan olarak

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

, hem kütüphaneleri dinamik bağlantılıdır:

$ 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 

ne kadar fark sürüm a ve sürüm a1 arasında olacak mı? Uygulama içinden ve int glibc'den farklı şekilde ne olacak? Pthreads'ların bağlanması, iş parçacığı güvenli olmayandan iş parçacığı güvenli algoritmaya bir şey mi değiştirecek?

E.g. a1 izlemesinde

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

, iki ek kütüphaneleri biraz daha mprotect s denir yüklenir ve bölümüne eklenir: kendisi birçok pthread fonksiyonları için saplama kodu içeren

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

cevap

14

glibc'nin. Bu glibc pthread işlevleri hiçbir şey yapmaz. Bununla birlikte, program libpthread ile bağlantılı olduğunda, bu saplamalar gerçek pthread kilitleme işlevleriyle değiştirilir.

Bu, iş parçacığı için güvenli olması gereken ancak iş parçacığı kullanmayan kitaplıklarda kullanılmak üzere tasarlanmıştır. Bu kütüphaneler pthread kilitleri kullanabilir, ancak libpthread'e bağlanan bir program veya kitaplık yüklenene kadar bu kilitler gerçekte gerçekleşmeyecektir.

+0

Pthread bağlandığında hangi saplamalar değişti? – osgx

+2

@osgx: http://www.ohloh.net/p/libpthread-stubs –