2009-05-18 18 views
39

लिनक्स पर (कर्नेल 2.6.5) हमारी बिल्ड सिस्टम -D_REENTRANT के साथ जीसीसी को कॉल करती है।क्या मुझे -D_REENTRANT -pthreads की आवश्यकता है?

क्या यह अभी भी pthreads का उपयोग करते समय आवश्यक है?

यह gcc -pthread विकल्प से कैसे संबंधित है? मैं समझता हूं कि मुझे -pthread का उपयोग pthreads के साथ करना चाहिए, क्या मुझे अभी भी -D_REENTRANT की आवश्यकता है?

एक तरफ नोट पर, क्या कोई अंतर है जिसे आप जीसीसी 3.3.3 और जीसीसी 4.x.x के बीच रिंटेंट के उपयोग के बीच जानते हैं?

जब मैं -pthread जीसीसी विकल्प का उपयोग करता हूं तो मैं देख सकता हूं कि _REENTRANT परिभाषित हो जाता है। कमांड लाइन से -D_REENTRANT को छोड़कर कोई फर्क पड़ता है, उदाहरण के लिए कुछ ऑब्जेक्ट्स को बहुप्रचारित समर्थन के बिना संकलित किया जा सकता है और फिर बाइनरी में जोड़ा जा सकता है जो pthreads का उपयोग करता है और समस्याएं पैदा करेगा?

मुझे लगता है कि यह सिर्फ उपयोग करने के लिए ठीक होना चाहिए:g++ -pthread

> echo | g++   -E -dM -c - > singlethreaded 
> echo | g++ -pthread -E -dM -c - > multithreaded 
> diff singlethreaded multithreaded 
39a40 
> #define _REENTRANT 1 

हम कई स्थिर पुस्तकालयों और अनुप्रयोगों है कि स्थिर पुस्तकालयों के साथ लिंक करते हैं, दोनों पुस्तकालयों और आवेदन उपयोग pthreads संकलित कर रहे हैं।

मेरा मानना ​​है कि यह अतीत में किसी चरण में आवश्यक था लेकिन यह जानना चाहता है कि अभी भी इसकी आवश्यकता है या नहीं। Googling ने pthreads के साथ उल्लेख की गई किसी भी हालिया जानकारी को वापस नहीं किया है। क्या आप मुझे कर्नेल/जीसीसी/पीथ्रेड के हाल के संस्करण में उपयोग पर चर्चा करने वाले लिंक या संदर्भों पर इंगित कर सकते हैं?

स्पष्टीकरण: फिलहाल हम -D_REENTRANT और -lpthread का उपयोग कर रहे हैं, मुझे लगता है कि मैं उन्हें केवल g ++ -pthread के साथ प्रतिस्थापित कर सकता हूं, मैन जीसीसी को देखकर यह प्रीप्रोसेसर और लिंकर दोनों के लिए झंडे सेट करता है। कोई विचार?

+16

आपने सही तरीके से जांच की और अपने स्वयं के प्रश्न का उत्तर दिया। का प्रयोग करें 'जी ++ -pthread', यह' जी ++ -pthread -D_REENTRANT' के बराबर है। 'G ++ -D_REENTRANT' का उपयोग करना अलग होगा, यह सभी लिंकर झंडे सेट नहीं कर सकता है। – pts

+0

हम्म तो यह या तो 'जी ++ -D_REENTRANT -lpthread' या' जी ++ -pthread', दोनों रूप में एक ही प्रभाव है? – stefanB

+6

उपयोग करें -थथ्रेड, नहीं -lpthread। -प्थ्रेड विकल्प थ्रेडिंग के लिए आवश्यक सभी झंडे सेट करता है, भले ही आप किस प्लेटफॉर्म पर हों। -lpthread का उपयोग केवल libpthread में लिंक होगा, जो कुछ प्लेटफ़ॉर्म के लिए पर्याप्त नहीं हो सकता है। (उदाहरण के लिए, ओपनबीएसडी का उपयोग libpthread नहीं था --- इसके बजाय libc_r का उपयोग किया जाता था।) –

उत्तर

17

मेरे लिए सबसे अच्छा जवाब pts से टिप्पणी करता है, तो केवल वह उत्तर के रूप में प्रस्तुत करने के लिए परेशान करता था:

आप ठीक से जांच की और अपने खुद के सवाल का जवाब दे। g++ -pthread का प्रयोग करें, यह g++ -lpthread -D_REENTRANT के बराबर है। g++ -D_REENTRANT का उपयोग अलग होगा, यह सब लिंकर झंडे सेट नहीं कर सकता है। - अंक 18 मई 0:30

+1

कि होना चाहिए "... यह बराबर जी ++ -lpthread -D_REENTRANT है"? यानी दूसरा -pthread -lpthread किया जाना चाहिए – BCran

+0

सही है, शायद मूल टिप्पणी में लेखन भूल ... – stefanB

7

जीसीसी जानकारी पृष्ठों से:

`-pthread' 
    Adds support for multithreading with the "pthreads" library. This 
    option sets flags for both the preprocessor and linker. 

तो बस -pthread झंडा पर्याप्त होना चाहिए। हालांकि, मैं इसे केवल आपके कुछ कोड में पास करने की अनुशंसा नहीं करता हूं।

क्रिस के रूप में टिप्पणी में सुझाव दिया, लिनक्स पर जीसीसी -dumpspecs का उपयोग कर वास्तव में इस बात की पुष्टि करता है कि यह पूर्वप्रक्रमक झंडे सेट के साथ-साथ:

%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT} 
5

जीसीसी के -pthreads झंडा आवश्यक प्रासंगिक संकलक और लिंकर झंडे सेट pthreads समर्थन के लिए जिस मंच पर आप हैं।

आप सही हैं, लिनक्स x86 (और शायद कई अन्य प्लेटफ़ॉर्म) पर, जो '-D_REENTRANT -lpthread' के समतुल्य है लेकिन यह सभी प्लेटफ़ॉर्म पर आवश्यक नहीं है।

(कम से कम कुछ समय के लिए, ऐक्स पर, -पिथ्रेड ने पूरी तरह से अलग libstdC++ में लिंक करने के लिए g ++ का कारण बनाया। ए। मुझे नहीं पता कि यह अभी भी मामला है, हालांकि ...)

+0

* "कम से कम कुछ समय के लिए, ऐक्स पर, -प्थ्रेड ने पूरी तरह से अलग libstdC++ में लिंक करने के लिए g ++ को जन्म दिया।" * - +1, इसने AIX पर एक क्रैश को मंजूरी दे दी क्योंकि हम '-pthread' या' -D_REENTRANT का उपयोग नहीं कर रहे थे ', लेकिन हमने' -lpthread' का उपयोग किया। – jww

संबंधित मुद्दे