2011-02-01 13 views
7

पृष्ठभूमि: मैं एक लॉगिंग लाइब्रेरी पर काम कर रहा हूं जिसका प्रयोग कई कार्यक्रमों द्वारा किया जाता है।
मैं प्रत्येक थ्रेड के लिए एक मानव-पठनीय नाम असाइन कर रहा हूं, मुख्य धागा को "मुख्य" प्राप्त करना चाहिए, लेकिन मैं प्रत्येक राज्य की शुरुआत में कोड की आवश्यकता के बिना उस स्थिति को लाइब्रेरी के भीतर से पहचानने में सक्षम होना चाहता हूं () समारोह।मैं कैसे बता सकता हूं कि प्रक्रिया में pthread_self मुख्य (प्रथम) धागा है या नहीं?

यह भी ध्यान दें: पुस्तकालय कोड हमेशा मुख्य धागे से पहले दर्ज नहीं किया जाएगा।

+0

आप अन्य मानव पठनीय नाम कैसे प्राप्त करूं? – Potatoswatter

+0

अधिक विशेष रूप से, वह पैटर्न क्या है जिसके लिए 'मुख्य' अनुरूप होना विफल रहता है? – Potatoswatter

+0

सिस्टम में अधिकांश धागे केवल कुछ ही तरीकों से शुरू किए गए हैं। वहां एक सामान्य कोड है जो आभासी std :: स्ट्रिंग नाम() फ़ंक्शन पर भरोसा कर सकता है। हालांकि मुख्य धागा अलग है। –

उत्तर

11

इस थोड़े संभव है, जिस पर आप हैं मंच पर निर्भर करता है, लेकिन पूरी तरह से किसी भी पोर्टेबल और सामान्य तरीके से नहीं ...

मैक ओएस एक्स एक सीधा और दस्तावेज दृष्टिकोण के साथ केवल एक ही प्रतीत हो रहा है, उनके pthread.h फ़ाइल के अनुसार:

/* returns non-zero if the current thread is the main thread */ 
int pthread_main_np(void); 

मैंने यह भी पाया FreeBSD एक pthread_np.h हैडर कि pthread_main_np() को परिभाषित करता है है, तो इस FreeBSD पर भी (कम से कम 8.1) काम करना चाहिए कि, और OpenBSD (4.8 कम से कम) pthread_main_np() को pthread.h में भी परिभाषित किया गया है। ध्यान दें कि _np स्पष्ट रूप से गैर पोर्टेबल के लिए खड़ा है!

अन्यथा, दिमाग में आने वाला एकमात्र "सामान्य" दृष्टिकोण वर्तमान थ्रेड के टीआईडी ​​की प्रक्रिया की पीआईडी ​​की तुलना कर रहा है, यदि वे मेल खाते हैं, तो वह धागा मुख्य है। यह सभी प्लेटफार्मों पर काम नहीं करता है, यह इस बात पर निर्भर करता है कि आप वास्तव में एक टीआईडी ​​प्राप्त कर सकते हैं (उदाहरण के लिए आप ओपनबीएसडी में नहीं हो सकते हैं), और यदि आप करते हैं, तो यदि इसका पीआईडी ​​से कोई संबंध है या यदि थ्रेडिंग उपप्रणाली का अपना लेखांकन होता है जो आवश्यक रूप से संबंधित नहीं है।

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

मैं देख लिया है प्लेटफार्मों का एक संक्षिप्त सारांश:

  • लिनक्स: यहाँ संभव, syscall (SYS_gettid) == getpid() आप क्या चाहते हैं
  • FreeBSD है:, यहाँ संभव नहीं thr_self यहां संभव नहीं है, वहाँ एक टीआईडी ​​
  • NetBSD प्राप्त करने के लिए कोई रास्ता नहीं है:() यादृच्छिक लगता है और संबंध के बिना getpid करने के लिए()
  • OpenBSD यहाँसंभव, _lwp_self() हमेशा मीटर के लिए 1 रिटर्न ऐन धागा
  • सोलारिस: संभव यहाँ, pthread_self() हमेशा मुख्य थ्रेड

के लिए 1 रिटर्न तो बुनियादी तौर पर आप मैक ओएस एक्स, FreeBSD और OpenBSD पर सीधे यह करने के लिए सक्षम होना चाहिए।

आप लिनक्स पर टीआईडी ​​== पीआईडी ​​दृष्टिकोण का उपयोग कर सकते हैं।

आप NetBSD और सोलारिस टीआईडी ​​== 1 दृष्टिकोण का उपयोग कर सकते हैं।

मुझे आशा है कि इस मदद करता है, एक अच्छा दिन है!

+1

MacOSX में * बीएसडी तरह बताते हैं जहां 'pthread_main_np के अपने प्रयोग()' से आता है मजबूत जड़ें। यह सभी * बीएसडी पर भी एक पूरी तरह से प्रलेखित इंटरफेस (एक मैनपेज मिला है) है। सोलारिस के पास 'thr_main()' के बराबर है और आप वहां 'pthread_main_np thr_main' को परिभाषित कर सकते हैं। 'TID == 1' चाल से बेहतर उपयोग करें। –

+1

यह शायद कह बिना चला जाता है, लेकिन अगर आप भी आईओएस के लिए लेखन पर योजना, pthread_main_np() फ़ंक्शन भी समर्थित है। – NSDestr0yer

7

मुख्य() से pthread_self() को कॉल करें और परिणाम रिकॉर्ड करें। भावी कॉल की तुलना pthread_self() से अपने संग्रहीत मूल्य पर करें ताकि यह पता चल सके कि आप मुख्य धागे पर हैं या नहीं।

+1

मैंने यह प्रश्न स्पष्ट करने के लिए अपना प्रश्न संपादित किया है कि इस पुस्तकालय का उपयोग कई कार्यक्रमों द्वारा किया जाता है। प्रत्येक को नया कोड जोड़ना अवांछनीय है। –

0

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

जब थ्रेड मर जाता है, तो क्या यह स्मृति को लीक करने से बचने के लिए मैपिंग से इसका नाम हटा देता है।

इस विधि को सभी धागे को नामित करने की अनुमति देनी चाहिए, केवल मुख्य नहीं।

+0

मुझे यह सब मिला है। यह स्वचालित निर्धारण के साथ मदद नहीं करता है कि कौन सा धागा मुख्य है। –

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

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