संकलन करते समय -प्राथमिक ध्वज का महत्व


143

विभिन्न बहु थ्रेडेड C और C ++ प्रोजेक्ट्स में मैंने -pthreadध्वज को कंपाइलिंग और लिंकिंग स्टेज दोनों पर लागू देखा है, जबकि अन्य इसका उपयोग बिल्कुल नहीं करते हैं और -lpthreadलिंकिंग स्टेज पर जाते हैं।

क्या किसी खतरे को -pthreadझंडे के साथ जोड़ना और जोड़ना नहीं है - यानी -pthreadवास्तव में क्या करता है? मुझे मुख्य रूप से लिनक्स प्लेटफार्मों में दिलचस्पी है।

जवाबों:


107

प्रयत्न:

gcc -dumpspecs | grep pthread

और जो कुछ भी शुरू होता है उसे देखें %{pthread:

मेरे कंप्यूटर पर, इसका कारण फाइलों को संकलित करना -D_REENTRANTऔर उनके साथ लिंक करना है -lpthread। अन्य प्लेटफार्मों पर, यह अलग हो सकता है। -pthreadअधिकांश पोर्टेबिलिटी के लिए उपयोग करें ।

_REENTRANTGNU libc के उपयोग से , कुछ libc हेडर के काम करने के तरीके में बदलाव होता है। एक विशिष्ट उदाहरण के रूप में, यह errnoएक फ़ंक्शन को थ्रेड-लोकल लोकेशन लौटाता है।


3
यह सिर्फ errnoसामान्य रूप से नहीं हो सकता है और प्रीप्रोसेसिंग नहीं हो सकता है । मुझे यकीन नहीं है कि लेख hpl.hp.com/techreports/2004/HPL-2004-209.pdf कितना प्रासंगिक है, जीसीसी अनुकूलन के लिए अभ्यास में है, लेकिन मुझे यकीन है कि वहां समीक्षा की गहराई से प्रभावित हुआ था।
पास्कल क्यूक

2
मुझे नहीं लगता कि इरनो का उदाहरण सही है। यहां तक ​​कि -pthread फ़्लैग या _REENTRANT के बिना भी, मेरे ग़लती .h (glibc 2.10.1) और gcc (4.4.1 amd64 पर) ग़लती से निपटने के लिए एक डायनामिक कॉल उत्पन्न करता है और प्रतीक पते के खिलाफ लिंक नहीं करता है।
एंडी रोस

1
@ पास्कल: लिंक के लिए धन्यवाद। यह इस समय मेरे सिर से थोड़ा ऊपर चला गया है, लेकिन ऐसा लगता है कि केंद्रीय बिंदु यह है कि थ्रेडिंग को केवल "पर" नहीं किया जा सकता है, बल्कि इसे स्मृति मॉडल के भाग के रूप में डिज़ाइन किया जाना चाहिए। मैं इससे पूरी तरह सहमत हूं।
क्रिस जेस्टर-यंग

2
@Andy - आपके -D_REENTRANTया -pthreadअपने आप प्रदान करने के लिए gcc का संस्करण बनाया जा सकता है । अपने बिल्ड के साथ चलाएं g++ -vऔर यह बहुत सारे आउटपुट को डंप करेगा कि कंपाइलर फ्रंट-एंड वास्तव में किन मापदंडों से गुजर रहा है cc1plusऔर ld
टॉम

3
यहां अभी भी एक सवाल का जवाब नहीं दिया गया है: क्या किसी खतरे को -प्रथ्रेड फ्लैग के साथ संकलित और जोड़ना नहीं है - यानी वास्तव में क्या करता है?
नत्थेनो

40

से man gcc:

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

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