2010-10-27 13 views
18

के लिए थ्रेड सुरक्षा मैं धागे के बीच संवाद करने के लिए एक कतार का उपयोग कर रहा हूँ। मेरे पास एक पाठक और एकाधिक लेखक धागे हैं। मेरा सवाल यह है कि जब मैं पाठक के लिए कतार से पुश/फ्रंट/पॉप का उपयोग करता हूं तो मुझे हर बार कतार को लॉक करने की आवश्यकता होती है?एसटीएल कतार

//reader threads 
getLock(); 
get the number of elements from the queue 
releaseLock(); 

int i = 0; 
while(i < numOfElements){ 
    queue.front(); 
    queue.pop(); 
    i++ 
} 

विचार यह है कि मैं बंद कर दिया कोड की और तब से लेखक धागा केवल कतार के पीछे से लिखते थे विवरण के स्तर को कम करना चाहते हैं और वहाँ केवल एक ही पाठक है: मैं निम्नलिखित की तरह कुछ कर सकते हैं धागा। जब तक मुझे तत्वों की संख्या मिलती है, तो मैं कतार से तत्व प्राप्त कर सकता हूं या क्या मुझे लॉक में front() और pop() संलग्न करने की आवश्यकता है?

उत्तर

8

कोई भी प्रकार जो स्पष्ट रूप से इसकी थ्रेड-सुरक्षा गारंटी को स्पष्ट नहीं करता है उसे हमेशा म्यूटेक्स द्वारा नियंत्रित किया जाना चाहिए। उस ने कहा, आपके कार्यान्वयन की stdlib इस के कुछ बदलाव की अनुमति दे सकती है - लेकिन आप std :: queue के सभी कार्यान्वयन के लिए नहीं जान सकते हैं।

जैसा कि std :: queue एक और कंटेनर लपेटता है (यह एक कंटेनर एडाप्टर है), आपको अंतर्निहित कंटेनर को देखने की आवश्यकता है, जो डेक के लिए डिफ़ॉल्ट है।

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

मैंने सी ++ 0x को यह देखने के लिए पर्याप्त नहीं देखा है कि क्या यह इस आउट ऑफ़ द बॉक्स के लिए कोई समाधान है, लेकिन यह एक और विकल्प हो सकता है।

+4

C++ 0x एटोमिक्स है द्वारा दिया जाता है है, इसलिए यह प्रोग्रामर ताला मुक्त लिखने के लिए सक्षम बनाता है की एक अच्छा विवरण (थ्रेड-सुरक्षित) एल्गोरिदम, और मानक म्यूटेक्स प्रदान करता है, लेकिन इसमें बॉक्स के बाहर कुछ भी नहीं है। – GManNickG

2

यह बिल्कुल कार्यान्वयन-निर्भर है। सी ++ मानक थ्रेड या थ्रेड सुरक्षा के बारे में उल्लेख करता है, इसलिए यह काम करेगा या नहीं, इस पर निर्भर करता है कि आपका कार्यान्वयन कतार तत्वों को कैसे प्रबंधित करता है।

आपके मामले में, पाठक वास्तव में कतार पॉपिंग कर रहा है, जिसे एक लेखन ऑपरेशन माना जाता है। मुझे संदेह है कि किसी भी सामान्य कार्यान्वयन वास्तव में इस मामले में थ्रेड-सुरक्षा की गारंटी देता है, जब कई धागे एक साथ कंटेनर को लिखते हैं। कम से कम वीसी ++ नहीं है:

उसी ऑब्जेक्ट को पढ़ने के लिए, ऑब्जेक्ट थ्रेड सुरक्षित है जब अन्य धागे पर कोई लेखक नहीं है।

एक ही ऑब्जेक्ट को लिखने के लिए, ऑब्जेक्ट थ्रेड से लिखने के लिए थ्रेड सुरक्षित है जब अन्य धागे पर कोई पाठक नहीं है।

9

जैसा कि अन्य ने पहले से ही उल्लेख किया है, मानक कंटेनरों को थ्रेड सुरक्षा की गारंटी देने की आवश्यकता नहीं है, इसलिए आप जो मांग रहे हैं वह पोर्टेबल रूप से लागू नहीं किया जा सकता है। आप उस समय को कम कर सकते हैं जब आपका पाठक थ्रेड 2 कतारों और कतार सूचक का उपयोग करके लेखकों को लॉक कर रहा है जो वर्तमान में लेखकों द्वारा उपयोग की जाने वाली कतार को इंगित करता है।

प्रत्येक लेखक होगा:

  • मोल ताला
  • पुश तत्व (रों) कतार में वर्तमान में कतार सूचक द्वारा की ओर इशारा किया
  • रिलीज ताला

पाठक तो क्या कर सकते हैं निम्नलिखित:

  • Acquir ई ताला
  • स्विच कतार सूचक दूसरी कतार में पहली पंक्ति से
  • रिलीज ताला
  • प्रक्रिया तत्वों बात करने के लिए
+0

लेखक कैसे काम करेगा? – GManNickG

+2

लेखक कतार सूचक जो वर्तमान में इंगित कर रहा है (पहले लॉक प्राप्त करने के बाद) जो भी कतार में संलग्न होगा। इस परिदृश्य में, लॉक जो भी कतार वर्तमान में संदर्भित करता है (और पॉइंटर स्वयं) को सुरक्षित करता है; अन्य कतार ("पहली कतार") को लॉकर रखने वाले पाठक w/o द्वारा संसाधित किया जा सकता है। –

1

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

यदि आप धागे के बीच राज्य या संसाधन साझा करने से बच सकते हैं तो आपको एक साथ थ्रेड चलाने में कोई समस्या नहीं है। तब थ्रेड को एक दूसरे के बारे में चिंता करने की ज़रूरत नहीं है, क्योंकि वे पूरी तरह से अलग हैं और एक-दूसरे पर कोई प्रभाव नहीं डालते हैं।

1

आपका हंच सही है: भले ही आप थ्रेड सुरक्षित होने के लिए एसटीडी कतार पर भरोसा नहीं कर सकते हैं, फिर भी कतार डिज़ाइन द्वारा सुरक्षित होना चाहिए।

क्यों कि मामला और धागा सुरक्षित की एक मानक कार्यान्वयन, सी में नि: शुल्क कतारों ताला ++ van Dooren

+2

बेवकूफ ताला मुक्त कतार कार्यान्वयन केवल विशेष मामला एकल निर्माता, एकल उपभोक्ता और संकलक द्वारा उत्पन्न कोड में स्मृति बाधाओं और परमाणु पढ़ने/लिखने के बारे में कुछ और धारणाओं के लिए आंशिक रूप से "थ्रेड सुरक्षित" है। हालांकि वास्तव में लॉक फ्री थ्रेड सुरक्षित कतार को कार्यान्वित करना संभव है लेकिन यह इतना आसान नहीं है। – Leo

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