2012-08-02 7 views
12

मैं सिर्फ g++ 4.6 और C++11 सुविधाओं पर अपने हाथों की कोशिश कर रहा हूं। हर बार जब मैं -std=c++0x ध्वज का उपयोग करके एक साधारण थ्रेडिंग कोड संकलित करता हूं, तो यह सेगमेंटेशन गलती से क्रैश हो जाता है या यह कुछ अजीब अपवाद फेंकता है।जी ++ में पृष्ठभूमि में pthreads का उपयोग कर सी ++ 11 धागा मॉडल है?

मैंने C++11 धागे से संबंधित कुछ प्रश्न पढ़े और मुझे एहसास हुआ कि, मुझे कोड को ठीक से संकलित करने के लिए -pthread ध्वज का उपयोग करने की भी आवश्यकता है। -pthread का उपयोग ठीक काम किया और मैं थ्रेडेड कोड चलाने में सक्षम था।

मेरा सवाल है, क्या C++11 बहु थ्रेडिंग मॉडल पृष्ठभूमि में Pthreads का उपयोग करता है? या यह स्क्रैच से लिखा गया है?

मुझे नहीं पता कि कोई भी सदस्य gcc योगदानकर्ता है लेकिन मैं केवल उत्सुक हूं।

+0

@ क्या ऐसा लगता है कि प्रश्न g ++ 4.6 के बारे में है। – juanchopanza

+2

"कुछ अजीब अपवाद" शायद 'std :: system_error' है, मानक द्वारा आवश्यक जब थ्रेड को नहीं बनाया जा सकता है (उदाहरण के लिए क्योंकि आपने libpthread.so से '-pthread' के साथ लिंक नहीं किया है)। मैं अपवाद देता है कि संदेश में सुधार करने पर काम कर रहा हूं, http://gcc.gnu.org/PR52681 –

+1

@ जोनाथन वाकई .... हाँ, यह अपवाद है कि मैं अपने लिनक्स मशीन पर काम कर रहा हूं ... एएमडी के साथ टूरियन एक्स 2 .... हालांकि यह मेरे रूममेट्स इंटेल मशीन पर '-प्थ्रेड' ध्वज के बिना आसानी से चला गया ... – Recker

उत्तर

21

यदि आप g++ -v चलाते हैं तो यह आपको कॉन्फ़िगर किया गया था इसके बारे में जानकारी का एक गुच्छा देगा। उन चीजों में से एक आम तौर पर एक लाइन है कि लग रहा है

तरह
Thread model: posix 

जिसका मतलब है कि वह अपने सूत्रण पुस्तकालय (std :: libstdc में ++ धागा) के लिए pthreads उपयोग करने के लिए कॉन्फ़िगर किया गया था, और आप भी किसी भी उपयोग करने की आवश्यकता है जिसका अर्थ है हो जाएगा झंडे जो आपके सिस्टम पर pthreads के लिए आवश्यक हो सकता है (लिनक्स पर -pthread)।

इस विशिष्ट कुछ भी नहीं मानक के साथ क्या करना है, इसका कितना मानक जी द्वारा कार्यान्वित किया जाता का एक विस्तार ++

+4

एनबी उन चीजों में से एक _always_ उस रेखा होगी, अगर थ्रेड समर्थन अनुपस्थित है तो यह कहेंगे "थ्रेड मॉडल: सिंगल" –

+0

ध्यान दें कि जीसीसी ने थ्रेड मॉडल की रिपोर्ट जीसीसी के अन्य हिस्सों, जैसे libgcc, और कंपाइलर पर भी प्रतिबिंबित की है। कई चीजें उस थ्रेड कार्यान्वयन के शीर्ष पर बनाई जा सकती हैं, सभी समान रूप से स्पष्ट नहीं हैं। जीसीसी उस संबंध में काफी "मोनोलिथिक" है ... – rubenvb

9

सी ++ कैसे धागे लागू किया जाता है निर्दिष्ट नहीं है। अभ्यास में सी ++ थ्रेड आमतौर पर पूर्व-विद्यमान सिस्टम थ्रेड लाइब्रेरीज़ (जैसे पेंथ्रेड या विंडोज थ्रेड्स) पर पतले रैपर के रूप में कार्यान्वित किए जाते हैं। Std :: thread :: native_handle() के साथ अंतर्निहित थ्रेड ऑब्जेक्ट तक पहुंचने का प्रावधान भी है।

+2

जी ++ एक यूनिक्स कंपाइलर नहीं है, यह विंडोज़ पर भी काम करता है, जहां इसे या तो pthread-win32 या देशी विंडोज थ्रेड का उपयोग करने के लिए कॉन्फ़िगर किया जा सकता है। अब तक किसी ने भी जीसीसी के लिए विंडोज सीडी के साथ सी ++ 11 थ्रेड लाइब्रेरी काम करने के लिए काम नहीं किया है, मैंने कुछ विचार http://gcc.gnu.org/ml/libstdc++/2012-05/msg00020.html पर पोस्ट किए हैं –

2

कारण यह है कि यह दुर्घटनाओं है कि यदि आप -pthreads या -lpthreads निर्दिष्ट नहीं करते, libc से दुर्बलता से परिभाषित pthreads ठूंठ कई कार्य करने की जुड़े हुए हैं है। ये स्टब फ़ंक्शन आपके प्रोग्राम को त्रुटि के बिना लिंक करने के लिए पर्याप्त हैं। हालांकि, वास्तव में एक pthread बनाने के लिए libpthread.a लाइब्रेरी पर पूरा होना आवश्यक है, और जब गतिशील लिंकर (dl) उन लापता कार्यों को हल करने का प्रयास करता है, तो आप एक सेगमेंटेशन उल्लंघन प्राप्त करते हैं।