2013-08-06 6 views
6

में मजबूत थ्रेड-स्थानीय स्टोरेज कैसे करें मुझे विभिन्न आईओएस ऐप्स में लिंक करने के लिए डिज़ाइन की गई लाइब्रेरी में pthread_getspecific से गलत परिणाम प्राप्त करने में कुछ समस्याएं आ रही हैं।आईओएस

मुझे लगता है कि Apple writes:

कोको और POSIX अलग अलग तरीकों से धागा शब्दकोश की दुकान है, तो आप मिश्रण नहीं कर सकते हैं और मैच दो प्रौद्योगिकियों के लिए कहता है। जब तक आप अपने थ्रेड कोड के अंदर एक तकनीक के साथ चिपके रहते हैं, तब तक, अंतिम परिणाम समान होना चाहिए। कोको में, आप NSMutableDictionary ऑब्जेक्ट को पुनर्प्राप्त करने के लिए NSThread ऑब्जेक्ट की थ्रेड डिक्शन विधि का उपयोग करते हैं, जिसमें आप अपने थ्रेड द्वारा आवश्यक कोई भी कुंजी जोड़ सकते हैं। POSIX में, आप अपने धागे की चाबियाँ और मान सेट करने और प्राप्त करने के लिए pthread_setspecific और pthread_getspecific फ़ंक्शंस का उपयोग करते हैं।

मतलब यह है कि कोको और न ही POSIX टीएलएस कार्यों पुस्तकालय कोड में काम करने के लिए जब हम चाहे कोड हमें कॉल कि पहले से ही एक या अन्य उपयोग कर रहा है पता नहीं है उम्मीद की जा सकती है?

इन परिस्थितियों में कोई थ्रेड-स्थानीय सूचक को कैसे स्टोर और पुनर्प्राप्त करने के लिए मिलता है?

क्या कोई मूल डार्विन टीएलएस समर्थन API है जिसे हमें कोको या पॉज़िक्स के बजाय उपयोग करना चाहिए?

+0

** हल किया गया **: शुरुआती रूप से मुझे संदेह है कि मुझे pthread_getspecific के खराब होने का संदेह है, कार्यक्रम में कहीं और एक असंबंधित दौड़ की स्थिति से छोड़े गए पॉइंटर्स को लटकाने के कारण बन गया है। –

उत्तर

6

मुझे विश्वास है कि ऐप्पल के दस्तावेज़ बना रहे हैं कि आप मूल्य निर्धारित करने के लिए pthread_setspecific का उपयोग नहीं कर सकते हैं और फिर threadDictionary में उपलब्ध होने की उम्मीद कर सकते हैं। मैं उम्मीद नहीं करता कि वे सीधे एक दूसरे के साथ हस्तक्षेप करें; वे सिर्फ अलग हैं।

यह कहा गया कि, यदि यह आईओएस-विशिष्ट कोड है, तो इसे प्रबंधित करने के लिए the strongly preferred way यह पॉज़िक्स थ्रेड के बजाय जीसीडी के साथ है। जीसीडी dispatch_get_specific, dispatch_queue_get_specific और dispatch_queue_set_specific के रूप में टीएलएस के बराबर प्रदान करता है। लेकिन यह POSIX धागे की तुलना में बहुत बेहतर थ्रेड प्रबंधन भी प्रदान करता है।

+0

हस्तक्षेप हमारे द्वारा देखे जा रहे क्रैश के लिए इतना अच्छा स्पष्टीकरण होगा, हालांकि ... यह मौजूदा कोड के लिए आईओएस-विशिष्ट गोंद परत है जो प्लेटफार्मों की सभी भीड़ों के लिए एक आम अमूर्तता देखना चाहता है। एक विक्रेता लॉक-इन में शामिल होना जो भूमिका को कम करना चाहता है या हमारी मौजूदा अच्छी तरह से काम करने वाली समरूपता अवधारणाओं का विकल्प नहीं है। –

+0

(कार्यक्रम के बाद कहीं और एक हस्तक्षेप स्नफू नहीं था, जिसके कारण कुछ पॉइंटर्स लटकने लगे)। –

1

यदि आपको सी ++ का उपयोग करने में कोई फर्क नहीं पड़ता है, तो बूस्ट thread_specific_ptr है। यह आईओएस का समर्थन करता है। यदि आप सी ++ का उपयोग नहीं करना चाहते हैं, तो कार्यान्वयन संभवतः कुछ बाहरी निर्भरताओं के बिना इसे कैसे काम करने के बारे में कुछ संकेत प्रदान करता है।