बीच क्या अंतर है gcc -pthread
और gcc -lpthread
जो है, जबकि थ्रेड कार्यक्रमों संकलन किया जाता है?
बीच क्या अंतर है gcc -pthread
और gcc -lpthread
जो है, जबकि थ्रेड कार्यक्रमों संकलन किया जाता है?
जवाबों:
-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
समान रूप से आगे बढ़ने का उपयोग करने की कोशिश कर रहा है।
-lpthread
पूरे POSIX थ्रेडिंग लाइब्रेरी को प्राप्त करने के लिए पर्याप्त है।
-lpthread
करता है पूरे POSIX थ्रेडिंग पुस्तकालय मिलता है।
-lpthread
पूर्ण pthreads समर्थन प्राप्त करने के लिए लिंक करना पर्याप्त होना चाहिए। किसी अन्य संकलन के झंडे की जरूरत नहीं होनी चाहिए।
-lpthread
लेकिन संकलन के -pthread
लिए समर्थन प्राप्त करने के लिए अपर्याप्त नहीं है, जैसा कि मैंने अपनी पिछली टिप्पणी में पहले ही स्पष्ट कर दिया है।
-lpthread
। हालांकि, जीसीसी प्रलेखन का सुझाव है कि यह pthreads समर्थन प्राप्त करने के लिए अपर्याप्त हो सकता है, जो कि पिछली टिप्पणियों के माध्यम से मैंने किया है। अगर आप प्रदान नहीं करते हैं -lpthread
या कुछ यादृच्छिक अन्य मालिकाना विकल्पों के बारे में मुझे कोई परवाह नहीं है । केवल -lpthread
POSIX द्वारा pthreads की गारंटी के लिए निर्दिष्ट किया गया है और यह gcc के साथ पर्याप्त नहीं लगता है।
-pthread
Pthreads लाइब्रेरी के साथ मल्टीथ्रेडिंग के लिए समर्थन जोड़ता है। यह विकल्प प्रीप्रोसेसर और लिंकर ( man gcc
) दोनों के लिए झंडे सेट करता है ।
जबकि
-lpthread
लिंक करते समय अस्तित्व में आता है प्रीप्रोसेसिंग करते समय कोई प्रभाव नहीं होगा।
एक स्वीकृत उत्तर है, लेकिन, IMO, यह पर्याप्त संदर्भ और अंतर्दृष्टि प्रदान नहीं करता है। इसलिए यह अतिरिक्त जवाब।
-lpthread
एक समस्या का समाधान है जो अब मौजूद नहीं है (~ 2005 के बाद से)।
पुराने दिनों में Pthreads एपीआई के मालिकाना क्रियान्वयन थे जो कि LinuxThreads की तरह POSIX- अनुरूप नहीं थे । POSIX मानक केवल यह कहता है कि यदि कोई POSIX- अनुरूप व्यवहार चाहता है, तो किसी को -lpthread
POSIX एपीआई के POSIX- अनुरूप कार्यान्वयन को जोड़ने के लिए आवश्यक लिंक के साथ लिंक करना होगा , और इसके कई कार्यान्वयन होने चाहिए ।
आधुनिक ऑपरेटिंग सिस्टम में Pthreads API के एकाधिक कार्यान्वयन नहीं हैं। और यही कारण है कि -lpthread
अब कोई उद्देश्य नहीं है।
संकलनकर्ता की तरह gcc
और clang
(और, शायद, सभी लिनक्स संगत compilers) की आवश्यकता होती है का उपयोग करते हुए -pthread
दोनों के संकलन और जोड़ने POSIX अनुरूप मल्टी-थ्रेडेड अनुप्रयोगों और वह यह है कि क्या एक का उपयोग करना चाहिए के लिए आदेश पंक्ति विकल्प।
संकलन के समय, -pthread
विकल्प प्रकट होता है कि Pthread API का अनुरोध किया गया है (कई थ्रेडिंग API हो सकते हैं, जैसे Solaris थ्रेड्स) और प्लेटफ़ॉर्म-विशिष्ट मैक्रोज़ ( _REENTRANT
Linux_MT
पर , Solaris पर ) को परिभाषित करता है ।
लिंक समय पर, -pthread
आवश्यक पुस्तकालयों में लिंक (यदि हो तो) जो POSIX- अनुरूप Pthreads एपीआई व्यवहार को लागू करते हैं।
उपरोक्त स्पष्ट करता है कि -lpthread
न तो आवश्यक है और न ही पर्याप्त है।