10

मुझे पता है कि बाधाओं का उपयोग कर जीसीडी में पाठक-लेखक मुद्दों को हल करना संभव है। चूंकि मैं (आमतौर पर) जीसीडी के बजाय NSOperationQueue का उपयोग करने का प्रयास करता हूं, जब प्रदर्शन एक महत्वपूर्ण मुद्दा नहीं है, तो मुझे इस समस्या के लिए NSOperation-संगत समाधान चाहिए।NSOperationQueue के साथ पाठक-लेखक मुद्दों को हल करें?

मैंने अपना खुद का लिखने की कोशिश की है, लेकिन मेरा समाधान अनावश्यक हो गया है ... निश्चित रूप से किसी ने पहले से ही इस समस्या का सामना किया है?

क्या किसी को NSOperation के बारे में पता है-पाठक-लेखक समस्या के साथ संगत समाधान?

+0

अच्छा सवाल। कुछ समाधानों में रुचि रखते हैं ... –

+0

सेमफोर के साथ क्या गलत है? – MattD

+2

ऑपरेशन कतार के अंतर्निहित पर एक जीसीडी बाधा का उपयोग करना्यूयूयू डिस्पैच_क्यू धोखाधड़ी है? – stevesliva

उत्तर

1

सबसे NSOperationQueue hackery के साथ, आप आपरेशनों के बीच निर्भरता के लिए अपने समर्थन दोहन कर सकते हैं:

  • एक NSBlockOperation उपवर्ग बनाएँ, ReaderWriterBlockOperation। इसमें जोड़ें BOOL writer
  • प्रति संरक्षित संसाधन प्रति ऑपरेशन कतार बनाएं।
  • ग्राहकों को अपने ऑपरेशन कतार को उजागर करना बंद करें। इसके बजाय एपीआई -readWithBlock: और -writeWithBlock: का पर्दाफाश करें। दोनों ReaderWriterBlockOperation को एनक्यू करें, writer == NO वाला दूसरा, अन्य == YES। उनका ऑपरेशन निम्नानुसार निर्भरता प्रबंधित करता है:
    • -readWithBlock:@synchronized(self) ब्लॉक में, पिछले लेखक से पहले लेखक ब्लॉक की तलाश में संचालन का एक स्कैन करता है। यदि कोई नहीं मिला है, तो यह संचालन और रिटर्न जोड़ता है। यदि कोई पाया जाता है, तो यह नया पाठक ब्लॉक लेखक पर निर्भर करता है, इसे संलग्न करता है, और रिटर्न देता है।
    • -writeWithBlock: वही काम करता है। सिवाय इसके कि कतारबद्ध परिचालन में कोई लेखक नहीं मिला है, यह ब्लॉक को सभी पाठकों पर निर्भर करता है। यदि कोई कतारबद्ध परिचालनों में पाया जाता है, तो यह स्वयं उस ऑपरेशन और सभी निम्नलिखित (पाठक) संचालन पर निर्भर करता है।

इससे उन्हें पूरा कर लिया है से पहले लेखक जब तक सभी पाठकों को अवरुद्ध, और पाठकों तक सभी लेखकों को अवरुद्ध उन्हें पूर्ण कर लेने से पहले का परिणाम होना चाहिए।

एक संभावित मुद्दा: मैं अस्पष्ट हूं (क्योंकि दस्तावेज़ अस्पष्ट हैं, और मैंने इसे अभी तक लागू नहीं किया है) यदि NSBlockOperation वास्तव में अपने ब्लॉक को पूरा होने से पहले दौड़ने के लिए प्रतीक्षा करता है। यदि ऐसा नहीं होता है, तो आपको अपने आप को अपने ऑपरेशन सबक्लास में प्रबंधित करना होगा।

सभी ने कहा कि, यदि सिस्टम एक कार्य समाधान प्रदान करता है, जैसे अवरोध ब्लॉक, तो आपको इसका उपयोग करना चाहिए। यह पूरी प्रणाली एक हैक करने के लिए एक हैक है जो कुछ ऐसा करने के लिए कतार भेजती है जो कतारों को बहुत अच्छी तरह से संभालने के लिए ट्यून किया गया है। यदि प्रदर्शन वास्तव में कोई चिंता नहीं है, तो क्यों न केवल एक धारावाहिक कतार (NSOperationQueue अधिकतम समवर्ती ऑपरेशन गिनती == 1) का उपयोग करें?

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