संकलन करते समय -pthread और -lpread के बीच अंतर


जवाबों:


116

-pthread कंपाइलर को पर्थ्रेड लाइब्रेरी में लिंक करने के लिए बताता है और साथ ही थ्रेड्स के संकलन को कॉन्फ़िगर करता है।

उदाहरण के लिए, निम्न मैक्रोज़ को दिखाता है जो कि -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

-lpthreadविकल्प का उपयोग करने से केवल preadread पुस्तकालय जुड़ा हुआ है - पूर्व निर्धारित मैक्रोज़ परिभाषित नहीं होता है।

नीचे पंक्ति: आपको -pthreadविकल्प का उपयोग करना चाहिए ।


नोट: -pthreadविकल्प को जीसीसी डॉक्स में एक मंच विशिष्ट विकल्प के रूप में प्रलेखित किया गया है, इसलिए यह हमेशा उपलब्ध नहीं हो सकता है। हालाँकि, यह प्लेटफार्मों पर उपलब्ध है कि जीसीसी डॉक्स इसे स्पष्ट रूप से सूचीबद्ध नहीं करते हैं (जैसे कि i386 और x86-64) - आपको इसका उपयोग उपलब्ध होने पर करना चाहिए।

यह भी ध्यान दें कि अन्य समान विकल्पों का उपयोग जीसीसी द्वारा किया गया है, जैसे -pthreads( -pthreadसोलारिस 2 पर एक पर्याय के रूप में सूचीबद्ध ) और -mthread(i386 और x86-64 विंडोज पर मिनग-विशिष्ट धागा समर्थन के लिए)। मेरी समझ यह है कि जीसीसी -pthreadसमान रूप से आगे बढ़ने का उपयोग करने की कोशिश कर रहा है।


2
यह अजीब है क्योंकि यह सीधे POSIX का विरोधाभास करता है। POSIX अनिवार्य है कि पासिंग -lpthreadपूरे POSIX थ्रेडिंग लाइब्रेरी को प्राप्त करने के लिए पर्याप्त है।
फ़ुज

@FUZxxl पासिंग -lpthread करता है पूरे POSIX थ्रेडिंग पुस्तकालय मिलता है।
user253751

5
@ मिनीबिस नहीं, मेरा क्या मतलब है, POSIX का कहना है कि -lpthreadपूर्ण pthreads समर्थन प्राप्त करने के लिए लिंक करना पर्याप्त होना चाहिए। किसी अन्य संकलन के झंडे की जरूरत नहीं होनी चाहिए।
फ़ूज

1
@alecov क्या गलत है gcc के साथ गलत है, -lpthreadलेकिन संकलन के -pthreadलिए समर्थन प्राप्त करने के लिए अपर्याप्त नहीं है, जैसा कि मैंने अपनी पिछली टिप्पणी में पहले ही स्पष्ट कर दिया है।
फ़ुज

2
यदि आप POSIX वातावरण को कॉन्फ़िगर करते हैं और उसके साथ लिंक करते हैं तो @alecov POSIX जनादेश काम करता है -lpthread। हालांकि, जीसीसी प्रलेखन का सुझाव है कि यह pthreads समर्थन प्राप्त करने के लिए अपर्याप्त हो सकता है, जो कि पिछली टिप्पणियों के माध्यम से मैंने किया है। अगर आप प्रदान नहीं करते हैं -lpthreadया कुछ यादृच्छिक अन्य मालिकाना विकल्पों के बारे में मुझे कोई परवाह नहीं है । केवल -lpthreadPOSIX द्वारा pthreads की गारंटी के लिए निर्दिष्ट किया गया है और यह gcc के साथ पर्याप्त नहीं लगता है।
fuz

10

-pthreadPthreads लाइब्रेरी के साथ मल्टीथ्रेडिंग के लिए समर्थन जोड़ता है। यह विकल्प प्रीप्रोसेसर और लिंकर ( man gcc) दोनों के लिए झंडे सेट करता है ।

जबकि

-lpthread लिंक करते समय अस्तित्व में आता है प्रीप्रोसेसिंग करते समय कोई प्रभाव नहीं होगा।


4

एक स्वीकृत उत्तर है, लेकिन, IMO, यह पर्याप्त संदर्भ और अंतर्दृष्टि प्रदान नहीं करता है। इसलिए यह अतिरिक्त जवाब।


-lpthread एक समस्या का समाधान है जो अब मौजूद नहीं है (~ 2005 के बाद से)।

पुराने दिनों में Pthreads एपीआई के मालिकाना क्रियान्वयन थे जो कि LinuxThreads की तरह POSIX- अनुरूप नहीं थे । POSIX मानक केवल यह कहता है कि यदि कोई POSIX- अनुरूप व्यवहार चाहता है, तो किसी को -lpthreadPOSIX एपीआई के POSIX- अनुरूप कार्यान्वयन को जोड़ने के लिए आवश्यक लिंक के साथ लिंक करना होगा , और इसके कई कार्यान्वयन होने चाहिए

आधुनिक ऑपरेटिंग सिस्टम में Pthreads API के एकाधिक कार्यान्वयन नहीं हैं। और यही कारण है कि -lpthreadअब कोई उद्देश्य नहीं है।


संकलनकर्ता की तरह gccऔर clang(और, शायद, सभी लिनक्स संगत compilers) की आवश्यकता होती है का उपयोग करते हुए -pthreadदोनों के संकलन और जोड़ने POSIX अनुरूप मल्टी-थ्रेडेड अनुप्रयोगों और वह यह है कि क्या एक का उपयोग करना चाहिए के लिए आदेश पंक्ति विकल्प।

संकलन के समय, -pthreadविकल्प प्रकट होता है कि Pthread API का अनुरोध किया गया है (कई थ्रेडिंग API हो सकते हैं, जैसे Solaris थ्रेड्स) और प्लेटफ़ॉर्म-विशिष्ट मैक्रोज़ ( _REENTRANTLinux_MT पर , Solaris पर ) को परिभाषित करता है ।

लिंक समय पर, -pthreadआवश्यक पुस्तकालयों में लिंक (यदि हो तो) जो POSIX- अनुरूप Pthreads एपीआई व्यवहार को लागू करते हैं।

उपरोक्त स्पष्ट करता है कि -lpthreadन तो आवश्यक है और न ही पर्याप्त है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.