2011-06-07 10 views
11

मैं एक सवाल है: यदि हम एक आवेदन, जो कोई सूत्र का उपयोग करता है, हम इसे दो तरह से लिंक कर सकते हैं:क्या '-lpthread` को जोड़ने से अनुप्रयोग व्यवहार में परिवर्तन होता है? (लिनक्स, Glibc)

1) हमेशा की तरह लिंक, -lpthread और -ldl

2 के बिना) लिंक दो पुस्तकालयों में जोड़ें: libpthread और libdl।

उदा।

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

डिफ़ॉल्ट रूप से, दोनों libs गतिशील रूप से जुड़े हुए हैं:

$ 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 के अंदर अलग-अलग तरीके से क्या काम करेगा? क्या पर्थ्रेड को जोड़ने से थ्रेड-असुरक्षित थ्रेड-सुरक्षित एल्गोरिदम से कुछ बदल जाएगा?

उदा।

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

a1 का पता लगाने में, दो अतिरिक्त libs लोड किए गए हैं, कुछ और mprotect रों कहा जाता है और की धारा कहा:

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

+2

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