2012-09-13 13 views
6

कतार फोन करने वाले से एक तर्क है। मैं इनपुट dispatch_queue_t के प्रकार (धारावाहिक या समवर्ती) को जानना चाहता हूं क्योंकि मैं इसे अलग-अलग संभाल दूंगा।कैसे प्रेषण कतार (सीरियल या समवर्ती) के प्रकार का पता लगाने के लिए?

क्या यह संभव है? और इसे कैसे जांचें?

उत्तर

8

यदि आप केवल इतना है एक dispatch_queue_t है कि "किसी और" द्वारा पारित किया गया था है, वहाँ आप को पता है के लिए कोई रास्ता नहीं है। वह जानकारी प्रभावी रूप से आप से छिपी हुई है। आप अपने आप को कतारों का निर्माण कर रहे हैं, तो आप dispatch_queue_set_specific और dispatch_queue_get_specific इस्तेमाल कर सकते हैं कतार के संदर्भ डेटा में एक मूल्य छिपाया जा, और फिर उस वापस पढ़ें बाहर, लेकिन अगर आप कतार नहीं बना रहे हैं, तो आप भाग्य से बाहर हो।

Fwiw, एक भंगुर डिजाइन/विरोधी पैटर्न पर संकेत इस तरह की। एक पैरामीटर के रूप में एक कतार लेना मतलब है कि आप उस कतार पर भावी निष्पादन के लिए ब्लॉक शेड्यूल करेंगे। उस परिप्रेक्ष्य से इससे कोई फर्क नहीं पड़ता कि कतार समवर्ती या धारावाहिक है या नहीं।

अधिक बिंदु पर, आपका कोड इस तरह लिखा जाना चाहिए कि इससे कोई फर्क नहीं पड़ता कि यह धारावाहिक या समवर्ती कतार पर निष्पादित है या नहीं। यदि यह साझा संसाधनों का उपयोग करता है, तो उसे उन संसाधनों तक पहुंच को सिंक्रनाइज़ करना चाहिए, जैसे कि यदि इसे एक समवर्ती कतार पर निष्पादित किया जाना था, तो उन संसाधनों तक पहुंच सुरक्षित रहेगी। इसके विपरीत, सीरियल कतार पर चलने वाली परिस्थितियों से बचें एक समस्या होगी (यानी dispatch_sync का उपयोग करके रिकर्सिव ताले को प्राप्त करने की कोशिश न करें जो सीरियल हो सकती है।)

10

क्रमबद्ध निष्पादन की गारंटी देने के लिए मूर्खतापूर्ण तरीका जीसीडी में मनमाने ढंग से कॉलर-प्रदान की गई कतार अपनी खुद की सीरियल कतार बनाना है और कॉलर-प्रदान की गई कतार को अपनी कतार की लक्षित कतार (dispatch_set_target_queue (3) API का उपयोग करना) सेट करना है।

+0

मैं GCD से अभी तक एक और गुडी की खोज की है! धन्यवाद! कुछ साहित्य पढ़ने के बाद, मैं इस निष्कर्ष पर आया हूं कि यह वास्तव में एक अच्छा दृष्टिकोण है। :-) –

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