2009-10-08 14 views
13

क्या उद्देश्य-सी के एनएसटीएचड के बिना वर्तमान में चल रहे थ्रेड के किसी भी प्रकार के थ्रेड पहचानकर्ता को प्राप्त करने का कोई तरीका है।मैक/आईफोन: उद्देश्य-सी का उपयोग किए बिना थ्रेड पहचानकर्ता प्राप्त करने का कोई तरीका है?

मैं कई धागे ठीक से संभालने के लिए हमारी कस्टम डीबग ट्रेसिंग सिस्टम में सुधार कर रहा हूं। ट्रेस आउटपुट की प्रत्येक पंक्ति के लिए, मैं एक थ्रेड आईडी या थ्रेड नाम मुद्रित करना चाहता हूं। थ्रेड को विभिन्न तरीकों से तत्काल किया जाता है, उदा। NSOperationQueue और pthread दोनों कार्यों का उपयोग किया जाता है।

मेरे पास वर्तमान में निम्नलिखित दो विकल्प हैं, लेकिन मैं इनमें से किसी से भी संतुष्ट नहीं हूं। क्या कोई अन्य विकल्प भी हैं?

pthread_t विकल्प

pthread_t एक मंच विशिष्ट _opaque_pthread_h की एक typedef हो रहा है। अब _opaque_pthread_h के फ़ील्ड्स का उपयोग करना ठीक होगा, भले ही यह हैक-वाई है और पोर्टेबल नहीं है। इसमें __sig प्रकार का क्षेत्र लंबा है, लेकिन ऐसा लगता है कि मेरी प्रक्रिया के सभी धागे के लिए एक ही मूल्य है।

NSThread विकल्प

[NSThread name] स्थान पर होने NSAutoreleasePool आवश्यकता है, लेकिन मैं अपने कोड के अधिकांश के रूप में शुद्ध सी ++ है कि एक आवश्यकता है, इसलिए यह सिर्फ ग शुरू करने के लिए करने के लिए अच्छा होगा नहीं करना चाहती ++ autorelease पूल लपेटन के बिना समारोह।

उत्तर

22

मुझे एक ऐसा तरीका मिला जो ट्रेस आउटपुट के लिए किसी प्रकार का अद्वितीय पहचानकर्ता प्राप्त करने के लिए पर्याप्त है।

pthread_mach_thread_np का उपयोग थ्रेड पहचानकर्ता, आईफोन पर एक हस्ताक्षरित int प्राप्त करने के लिए किया जा सकता है।

mach_port_t tid = pthread_mach_thread_np(pthread_self()); 

जाहिर है यह एक ही धागा आईडी कि NSLog उत्पादन में प्रयोग किया जाता है।

+0

महान काम करता है, thanx! – JOM

+0

ओह, यह पहले से उपयोग की जा रही विधि से बहुत बेहतर है - थ्रेड के NSDictionary में मानों को सेट करना और पुनर्प्राप्त करना। धन्यवाद! (ओएसएक्स 10.4 का समर्थन करना।) – Marc

+1

'pthread_mach_thread_np'' pthread_self' के समान सीमाओं को पीड़ित नहीं करता है? अर्थात्, 'thread_id' अधिक बार फिर से अपेक्षित/वांछित पुन: उपयोग करते हैं? – jww

1

pthread_getname_np देखें।

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

pthread_getname_np शायद अभी भी एनएसटीएचड के नाम से थोड़ा अधिक उपयोगी है। जीडीबी और इंस्ट्रूमेंट्स एनएसटीएच के नाम के बारे में नहीं जानते हैं, केवल पर्थ्रेड स्तर का नाम।

+0

शानदार। मैं कल यह कोशिश करूंगा। –

+1

दुर्भाग्य से, आईफोन में pthread_getname_np नहीं है, इसलिए यह आईफोन पर काम नहीं करता है। –

0

थ्रेड की पहचान करने के लिए मैक पोर्ट नाम का उपयोग करने का एक नुकसान यह है कि लौटाया गया नाम कॉलिंग प्रक्रिया के लिए स्थानीय है। यदि कई कार्य किसी विशेष कार्य के धागे को पुनर्प्राप्त करते हैं (task_threads का उपयोग करके), प्रत्येक कार्य किसी विशेष थ्रेड के लिए एक अलग पोर्ट नाम पुनर्प्राप्त करेगा।

ओएस एक्स पर, आप thread_info का उपयोग करके एक अद्वितीय 64-बिट पहचानकर्ता पुनर्प्राप्त कर सकते हैं। यह पहचानकर्ता वैश्विक है (यह किसी दिए गए धागे के लिए समान है, इससे कोई फर्क नहीं पड़ता कि कौन सा कार्य पूछताछ कर रहा है) और अद्वितीय (कोई अन्य थ्रेड कभी भी एक ही आईडी नहीं होगा, अब या भविष्य में, पाठ्यक्रम के रीबूट के बाद तक - 64 के रूप में -बिट मूल्य, ओवरफ्लो असंभव है)।

(XNU source, XNU source देखें।)

इन पंक्तियों के साथ कोड का उपयोग कर एक pthread के लिए इस पहचानकर्ता प्राप्त करें:।

uint64_t GetThreadID(pthread_t thread) { 
    mach_port_name_t port=pthread_mach_thread_np(thread); 

    thread_identifier_info_data_t info; 
    mach_msg_type_number_t info_count=THREAD_IDENTIFIER_INFO_COUNT; 
    kern_return_t kr=thread_info(thread, 
           THREAD_IDENTIFIER_INFO, 
           (thread_info_t)&info, 
           &info_count); 
    if(kr!=KERN_SUCCESS) { 
     /* you can get a description of the error by calling 
     * mach_error_string(kr) 
     */ 
     return 0; 
    } else { 
     return info.thread_id; 
    } 
} 

(XNU source देखें)

दो टिप्पणियां:

  1. वहाँ THREAD_IDENTIFIER_INFO के लिए कोई प्रलेखन है, या कम से कम कोई भी जिसे मैं ढूंढने में सक्षम हूं। तो मुझे लगता है, कड़ाई से बोलते हुए, यह इसे अनियंत्रित करता है। लेकिन यह सार्वजनिक शीर्षलेखों में है, THREAD_BASIC_INFO के बगल में, दस्तावेज है - इसलिए मुझे लगता है कि यह बस एक निरीक्षण है। यह दस्तावेज़ीकरण की तरह नहीं है इस सामग्री के किसी भी विशेष रूप से बहुत अच्छा है के लिए।)

  2. मैं क्या स्थिति iOS पर है पता नहीं है, लेकिन THREAD_IDENTIFIER_INFO और pthread_mach_thread_np दोनों हेडर में उपलब्ध होने की दिखाई देगा, इसलिए इसके लायक हो सकता है एक कोशिश।

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

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