Saturday, 15 June 2013

ios - is this GCD implemented getter setter thread safe and work better than @synchronized? objc -


  @interface दृश्य नियंत्रक () @ प्रॉपर्टी (नॉनैटोमिक, मजबूत) NSString * someString; @end @implementation ViewController @ someString = _someString संसोधित करें; - (NSString *) कुछ स्ट्रिंग {__block NSString * tmp; Dispatch_sync (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {tmp = _someString;}); वापसी टीएमपी; } - (शून्य) setSomeString: (NSString *) कुछ स्ट्रिंग {__block NSString * tmp; Dispatch_barrier_sync (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {tmp = someString;}); _someString = tmp; } @ एंड  

कुछ ने कहा कि यह @synchronized से बेहतर है क्योंकि सभी लॉकिंग को जीसीडी में नियंत्रित किया जाता है।

सबसे पहले, आपके सेटर का कोई मतलब नहीं है, और डिफ़ॉल्ट समवर्ती कतार का उपयोग करना संभवतः शायद नहीं है जो आप चाहते हैं। आपका कोड शायद अधिक पसंद करना चाहिए:

  @ इंटरफेस देखें नियंत्रक () @ प्रॉपर्टी (नॉनैटोमिक, कॉपी) NSString * someString; @end @implementation ViewController {dispatch_queue_t _stateGuardQueue; } - (instancetype) init {if (self = [super init]) {_stateGuardQueue = dispatch_queue_create (NULL, DISPATCH_QUEUE_CONCURRENT); } स्वस्थ वापसी; } @ कुछ संश्लेषण = स्ट्रिंग = _someString; - (NSString *) कुछ स्ट्रिंग {__block NSString * tmp; डिस्पैच_एसआईएनसीसी (_स्टेट ग्वार्ड क्विन्यू, ^ {टीएमपी = _someString;}); वापसी टीएमपी; } - (शून्य) setSomeString: (NSString *) कुछ स्ट्रिंग {NSString * tmp = [someString copy]; Dispatch_barrier_async (_stateGuardQueue, ^ {_someString = tmp;}); } @end  

मेरे द्वारा किए गए परिवर्तन:

  • सेटर को वास्तव में महत्वपूर्ण खंड के अंदर उत्परिवर्तन करना
  • निजी उपयोग करें , वैश्विक डिफ़ॉल्ट समवर्ती कतार के बजाय प्रति-समवर्ती समवर्ती कतार; बाधा ब्लॉक को समरूप कतारों को डिफाइन किया जा रहा है जो आपको लगता है कि ऐसा नहीं करता है। (देखें)
  • dispatch_barrier_sync को प्रेषक_बारियर_असिनक में बदलने के लिए सेटर ब्लॉक के लिए सिंक्रोनस से प्रतीक्षा करने का कोई मतलब नहीं है, क्योंकि वहां कोई रास्ता नहीं है वर्तमान धागा पर एक बासी पढ़ा।
  • copy शब्दों को बदलने के लिए संपत्ति को परिवर्तित करें, जो कि मूल्य-अर्थ प्रकार ( NSString आदि) यह उन मामलों में विशेष रूप से महत्वपूर्ण है जहां संपत्ति एकाधिक थ्रेड्स से समवर्ती रूप से पढ़ी जा सकती है।

पता करने की बात यह है कि अलगाव में, इस पद्धति से "सुरक्षा" परमाणु गुण, इसलिए आपको यकीनन उन (कम कोड आदि) का उपयोग करना चाहिए। प्रदर्शन प्रश्न के रूप में, हां, इस विशेष उपयोग के लिए, जीसीडी निश्चित रूप से @ सिंक्रनाइज़ किए गए प्रदर्शन करेगा। एक के लिए, यह समवर्ती पढ़ता है, जहां @ सिंक्रनाइज़ किया गया समवर्ती पढ़ता क्रमबद्ध होगा। परीक्षण के बिना, मैं उम्मीद करता हूं कि परमाणु गुण दोनों को आउट-प्रदर्शन करेंगे। उस ने कहा कि परमाणु संपत्तियों, और सामान्य रूप से इस तरह के एकल कार्यों की सुरक्षा, शायद ही कभी पर्याप्त संतोषशीलता रणनीति है।


No comments:

Post a Comment