2009-02-05 15 views
6

मेरे पास एसटीएल सूची में थ्रेड पुश-बैकिंग और सूची से एक और थ्रेड पॉप-फ्रंटिंग है। क्या मुझे इस मामले में म्यूटेक्स के साथ सूची को लॉक करने की ज़रूरत है?क्या मुझे push_back pop_front परिदृश्य में म्यूटेक्स के साथ एसटीएल सूची लॉक करने की आवश्यकता है?

उत्तर

11
SGI's STL on Thread Safety से

:

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

चूंकि आपके दोनों धागे सूची को संशोधित करते हैं, मुझे लगता है कि आपको इसे लॉक करना होगा।

+1

SGI की एसटीएल एसटीएल एक जैसे सी में लागू ++ मानक पुस्तकालय के रूप में ही नहीं है:

अधिक जानकारियां के लिए इस पर एक नज़र डालें। उत्तरार्द्ध समवर्ती या थ्रेडिंग के बारे में कुछ भी नहीं कहता है। (यहां कई अन्य मतभेद भी हैं, हालांकि ये यहां प्रासंगिक नहीं हैं)। लेकिन संक्षेप में, आप यह नहीं मान सकते कि एसजीआई क्या कहता है stdlib पर लागू होगा – jalf

1

शायद। ये ऑपरेशन परमाणु होने के लिए पर्याप्त सरल नहीं हैं, इसलिए यदि कार्यान्वयन स्पष्ट रूप से आवश्यक लॉकिंग निष्पादित करता है तो वे केवल थ्रेड-सुरक्षित होंगे।

हालांकि, सी ++ मानक यह निर्दिष्ट नहीं करता है कि इन परिचालनों को थ्रेड-सुरक्षित होना चाहिए, इसलिए यह तय करने के लिए व्यक्तिगत कार्यान्वयन पर निर्भर है। दस्तावेज़ों की जांच करें। (या हमें बताएं कि आप किस कार्यान्वयन का उपयोग कर रहे हैं)

1

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

1

चूंकि एसटीएल पॉप/पुश ऑपरेशंस AFAIK गैर-परमाणु हैं, तो आपको एक म्यूटेक्स का उपयोग करना होगा।

3

अधिकांश एसटीएल कार्यान्वयन Sens कि आप ताला लगा के बिना कई उदाहरण कई धागे से एक सूची प्रकार का उपयोग कर सकते हैं में सुरक्षित धागा है। लेकिन जब आप अपनी सूची के उसी उदाहरण तक पहुंच रहे हों तो आपको लॉक करना होगा। thread safty in sgi stl

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