2010-12-09 8 views
11

मैं एंड्रॉइड 2.2 का उपयोग कर रहा हूं, जो एसटीएलपोर्ट के संस्करण के साथ आता है। किसी कारण से, इसे गैर-थ्रेड सुरक्षित होने के लिए कॉन्फ़िगर किया गया था। यह कॉन्फ़िगरेशन हेडर फ़ाइल में #define _NOTHREADS का उपयोग करके किया गया था।क्या सी ++ एसटीएल थ्रेड-सुरक्षित कंटेनरों के लिए सुरक्षित है (एसटीएलपोर्ट कार्यान्वयन का उपयोग कर)?

जब मैंने अलग-अलग अलग-अलग pthreads से गैर-साझा कंटेनर (उदा। तार) का निर्माण और प्रारंभ किया, तो मुझे स्मृति भ्रष्टाचार मिल रहा था।

_NOTHREADS के साथ, ऐसा लगता है कि allocator.cpp के अंदर एसटीएल में कुछ निम्न-स्तर कोड उचित लॉकिंग नहीं करता है। ऐसा लगता है कि सी मॉलोक के लिए थ्रेड सुरक्षा प्रदान नहीं कर रहा है।

क्या किसी को पता है कि एसटीएल एंड्रॉइड पर डिफ़ॉल्ट रूप से _NOTHREADS के साथ क्यों बनाया जा सकता है? इसे बंद करके, मैं सोच रहा हूं कि कोई दुष्प्रभाव हो सकता है या नहीं। एक बात जो मैं सोच सकता हूं वह थोड़ा अपमानजनक प्रदर्शन है, लेकिन मुझे बहुत पसंद नहीं दिख रहा है क्योंकि मैं बहुत सारे थ्रेडिंग का उपयोग कर रहा हूं।

+0

यह लोगों को आपके प्रश्न का उत्तर देने में मदद कर सकता है अगर आपने कुछ नमूना कोड दिया जो इस तरह की चीज दिखाता है जो समस्या का कारण बनता है। (मुझे पता है * मेरे पास इसका उत्तर देने की विशेषज्ञता नहीं है; एसटीएल कुछ ऐसा नहीं है जिसे मैंने गहराई से पढ़ा है।) –

+0

"एक्सेस ... ऑब्जेक्ट्स" से आपका क्या मतलब है? – LavaScornedOven

+0

इस प्रश्न से पहले पूछा गया है (देखें http://stackoverflow.com/questions/4029448/thread-safety-for-stl-queue और http://stackoverflow.com/questions/1362110/is-the-c-stl- stdset-thread-safe), लेकिन अभी तक इस प्रश्न के एक केंद्रीय उत्तर पर है। चूंकि यह संस्करण स्टैक ओवरफ्लो पर इस प्रश्न का उत्तर देने के लिए ** ** केंद्रीय स्थान बनने के लिए उतना ही अच्छा है, इसलिए कृपया अपने कार्यान्वयन का नाम शामिल करने के लिए एक बड़े शीर्षक का उपयोग करें, और मूल दस्तावेज़ के उद्धरण और लिंक को शामिल करें। –

उत्तर

5

एसजीआई एसटीएल

एसजीआई एसटीएल अन्य एसटीएल कार्यान्वयन के सभी की दादी है।

the SGI STL docs देखें।

एसटीएल के एसजीआई कार्यान्वयन केवल अर्थ है कि अलग कंटेनरों को एक साथ पहुंच सुरक्षित हैं में धागा सुरक्षित है, और एक साथ पढ़ने साझा कंटेनर सुरक्षित हैं करने के लिए करने के लिए एक्सेस करता है। यदि एकाधिक धागे एकल कंटेनर तक पहुंचते हैं, और कम से कम एक थ्रेड संभावित रूप से लिख सकता है, तो उपयोगकर्ता कंटेनर एक्सेस के दौरान थ्रेड के बीच आपसी बहिष्करण सुनिश्चित करने के लिए ज़िम्मेदार है।

जी ++

libstdc++ docs

वर्तमान में हम धागा सुरक्षा के एसजीआई एसटीएल परिभाषा का उपयोग करें।

STLport

STLPort docs

कृपया धागा सुरक्षा के बारे में विस्तृत दस्तावेज़ के लिए एसजीआई साइट देखें। बेसिक बिंदु हैं:

  • एक साथ पढ़ने के लिए अलग धागे के भीतर से ही कंटेनर के लिए उपयोग सुरक्षित है,
  • विशिष्ट कंटेनरों के साथ-साथ पहुंच ( धागे के बीच साझा नहीं) सुरक्षित है;
  • उपयोगकर्ता को पर सभी पहुंच के लिए सिंक्रनाइज़ेशन प्रदान करना होगा यदि कोई थ्रेड साझा कंटेनर संशोधित कर सकता है।
+0

स्ट्रिंग संदर्भ गिनती के बारे में कोई जानकारी? – doron

+0

दिलचस्प है कि एसटीएलपोर्ट दस्तावेज़ कहते हैं "अलग कंटेनर (धागे के बीच साझा नहीं) के साथ-साथ पहुंच सुरक्षित है"। यह सुविधा एंड्रॉइड पर अक्षम है। – Ravi

2

सी ++ स्टैंडर्ड

वर्तमान सी के बारे में सामान्य जानकारी ++ मानक बिल्कुल संगामिति मुद्दों का समाधान नहीं होता है, अब वहाँ सभी कार्यान्वयन पर लागू होने वाला कोई आवश्यकता है, तो कम से कम के लिए।

एक सार्थक उत्तर केवल एक विशिष्ट कार्यान्वयन (एसटीएलपोर्ट, इस मामले में) पर लागू हो सकता है। एसटीएलपोर्ट मूल रूप से मूल एसजीआई एसटीएल कार्यान्वयन का एक संस्करण है जो इसकी पोर्टेबिलिटी में सुधार के साथ है, इसलिए आप शायद मूल एसजीआई संस्करण में थ्रेड सुरक्षा के बारे में documentation से शुरू करना चाहते हैं।

+0

उपरोक्त लिंक से प्रलेखन में मिली समस्या का उल्लेख है: "Alloc.h पर्यावरण के आधार पर तीन अलग लॉकिंग प्राइमेटिव का उपयोग करता है। इसके अतिरिक्त, इसे मजबूर किया जा सकता है _NOTHREADS को परिभाषित करके लॉकिंग न करें। " एंड्रॉइड वितरण में, _NOTHREADS परिभाषित किया गया था। जब मैंने इसे अपरिभाषित किया, तो स्मृति भ्रष्टाचार की समस्याएं चली गईं। – Ravi

0

सूर्य कार्यशाला 5,0

This थोड़ा पुराने लेकिन काफी जानकारीपूर्ण है। निचली पंक्ति यह है कि एसटीएल केवल आवंटकों पर ताले प्रदान करता है।

स्ट्रिंग्स हालांकि गिने गए ऑब्जेक्ट्स का संदर्भ दिया जाता है लेकिन उनके संदर्भ गणना में किए गए किसी भी बदलाव परमाणु रूप से किया जाता है। यह केवल सत्य है हालांकि मूल्य के चारों ओर तारों को पार करते समय। एक ही स्ट्रिंग ऑब्जेक्ट के समान संदर्भ वाले दो धागे को अपनी लॉकिंग करने की आवश्यकता होगी।

+0

वर्तमान लिनक्स कार्यान्वयन में ताले हैं। – doron

0

जब आप उदा। std :: स्ट्रिंग या समान ऑब्जेक्ट्स, और उन्हें विभिन्न थ्रेड से बदलें, आप थ्रेड के बीच एक ही ऑब्जेक्ट साझा कर रहे हैं। किसी भी सदस्य फ़ंक्शन को बनाने के लिए आप स्ट्रिंग पुनर्विक्रेता पर कॉल कर सकते हैं, इसका मतलब यह होगा कि कोई अन्य थ्रेड हमारे मेम-फ़ंक्शन को प्रभावित नहीं कर सकता है, और हमारा फ़ंक्शन अन्य थ्रेड में किसी भी अन्य कॉल को प्रभावित नहीं कर सकता है। सच्चाई बिल्कुल विपरीत है, क्योंकि आप इस पॉइंटर के माध्यम से एक ही वस्तु साझा कर रहे हैं, जिसे सदस्य वस्तुओं को कॉल करते समय स्पष्ट रूप से दिया जाता है। इस कॉल

std::string a; 
a.insert(...); 

के बराबर समझने के लिए, OOP सिंटैक्स का उपयोग किया जाएगा के बिना:

std::string a; 
insert(&a, ...); 

तो, आप अप्रत्यक्ष रूप से आवश्यकता है कि कोई संसाधन समारोह कॉल के बीच साझा किया जाता है का उल्लंघन कर रहे हैं। आप अधिक here देख सकते हैं।

उम्मीद है कि इससे मदद मिलती है।

+0

ओप धागे के बीच वस्तु साझा नहीं करता है। – Basilevs

1

बेशक, पुन: प्रवेश के कारण यह प्रदर्शन के लिए है: गति, कम स्मृति उपयोग, कम संसाधन उपयोग। संभवतः ऐसा इसलिए है क्योंकि धारणा है कि अधिकांश क्लाइंट प्रोग्राम बहु-थ्रेडेड नहीं होंगे।

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