2013-01-09 13 views
6

निम्नलिखित स्थिति पर विचार करें।प्रतीक्षा (इसे POSIX सूत्र, C++)

यह बिल्कुल ठीक है (और वांछित) कि बार() समानांतर में कई बार निष्पादित किया जाता है, क्योंकि यह कभी भी foo की स्थिति को नहीं बदलता है।

समस्या उत्पन्न होती है जब मुझे बाहर से foo की स्थिति को बदलने की आवश्यकता होती है (किसी अन्य थ्रेड से, "कार्यकर्ता" धागे में से किसी एक से नहीं) - मैं एक तरह से foo कैसे लॉक कर सकता हूं ताकि कॉलिंग थ्रेड ब्लॉक हो जाए आखिरी कार्यकर्ता धागा बार() के साथ किया जाता है और सभी कार्यकर्ता धागे बार() पर अवरुद्ध हो जाएंगे जब तक कि मैं फिर से foo जारी नहीं करता?

स्पष्ट रूप से मैं केवल एक म्यूटेक्स का उपयोग नहीं कर सकता जो कि बार() के निष्पादन के दौरान बंद रहता है, क्योंकि तब मुझे वहां समरूपता नहीं होगी।

कोई विचार? या क्या उन प्रकार की समस्याओं के लिए एक बेहतर डिजाइन है?

+3

देखें [पाठक-लेखक लॉक] (http://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) – hmjd

+0

बार फ़ंक्शन के कॉलिंग के आसपास कार्यकर्ता धागे में एक म्यूटेक्स क्यों नहीं पेश करना कॉलिंग थ्रेड पर भी जो फूओस राज्य को बदलना चाहता है। कॉलिंग थ्रेड म्यूटेक्स को लॉक करता है और सुरक्षित रूप से फू के राज्य को बदल सकता है। – mgr

+2

'pthread_rwlock_t' आपके लिए ब्याज का हो सकता है। – WhozCraig

उत्तर

4

मुझे यकीन है कि आप कैसे प्राप्त करने के लिए जा रहे हैं नहीं कर रहा हूँ, कि कार्यकर्ताओं में से कोई भी foo का उपयोग कर रहे लेखक इसे अद्यतन जाने के लिए, लेकिन अगर यह एक चिंता का विषय नहीं है तो बस एक read/write mutex (कार्यकर्ताओं करने के लिए उपयोग लिखित लॉक प्राप्त करने के लिए रीड लॉक प्राप्त करें, लेखक)।

हालांकि उल्लेखनीय है कि आप फू कॉपी-ऑन-लिखित बनाने पर विचार करना चाहेंगे। इस तरह आप शून्य के करीब सिंक्रनाइज़ेशन ओवरहेड बना देंगे। आप इसे प्राप्त करने के लिए shared_ptr atomically का उपयोग कर सकते हैं।

+0

सभी पॉइंटर्स को pthread_rwlock_t के लिए धन्यवाद! – Pontomedon

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