ठीक है, लगता है यह मेरा अंतिम जवाब है।हमारे पास 2 वास्तविक समस्याएं हैं:
- लॉगिंग के लिए थ्रेड के लिए छोटे अद्वितीय आईडी कैसे प्राप्त करें।
- वैसे भी हमें थ्रेड के लिए वास्तविक pthread_t आईडी मुद्रित करने की आवश्यकता है (केवल कम से कम POSIX मानों से लिंक करने के लिए)।
1. प्रिंट POSIX आईडी (pthread_t)
आप बस प्रत्येक बाइट के लिए मुद्रित हेक्स अंक के साथ बाइट्स की सरणी के रूप में pthread_t इलाज कर सकते हैं। तो आप कुछ निश्चित आकार के प्रकार से सीमित नहीं हैं। एकमात्र मुद्दा बाइट ऑर्डर है। आपको शायद यह पसंद है कि आपके मुद्रित बाइट्स का क्रम सरल "int" मुद्रित जैसा ही है। यहाँ बड़े endian के लिए (परिभाषित के तहत?) थोड़ा-endian और केवल आदेश वापस लाए जाने चाहिए के लिए उदाहरण है:
#include <pthread.h>
#include <stdio.h>
void print_thread_id(pthread_t id)
{
size_t i;
for (i = sizeof(i); i; --i)
printf("%02x", *(((unsigned char*) &id) + i - 1));
}
int main()
{
pthread_t id = pthread_self();
printf("%08x\n", id);
print_thread_id(id);
return 0;
}
2. कम प्रिंट करने योग्य थ्रेड ID
जाओ प्रस्तावित से किसी भी मामले में आप चाहिए कुछ तालिका के सूचकांक के लिए वास्तविक धागा आईडी (posix) का अनुवाद करें। लेकिन 2 महत्वपूर्ण भिन्न दृष्टिकोण हैं:
2.1। ट्रैक धागे।
आप तालिका में मौजूद सभी मौजूदा धागे की थ्रेड आईडी ट्रैक कर सकते हैं (उनके pthread_create() कॉल को लपेटा जाना चाहिए) और "ओवरलोडेड" आईडी फ़ंक्शन है जो आपको केवल टेबल इंडेक्स प्राप्त करता है, असली थ्रेड आईडी नहीं। यह योजना संसाधन ट्रैकिंग को किसी भी आंतरिक थ्रेड से संबंधित डीबग के लिए भी बहुत उपयोगी है। स्पष्ट लाभ भविष्य के विस्तार के साथ थ्रेड-स्तरीय ट्रेस/डीबग सुविधा का दुष्प्रभाव है। किसी भी थ्रेड निर्माण/विनाश को ट्रैक करने के लिए नुकसान की आवश्यकता है।
pthread_create_wrapper(...)
{
id = pthread_create(...)
add_thread(id);
}
pthread_destruction_wrapper()
{
/* Main problem is it should be called.
pthread_cleanup_*() calls are possible solution. */
remove_thread(pthread_self());
}
unsigned thread_id(pthread_t known_pthread_id)
{
return seatch_thread_index(known_pthread_id);
}
/* user code */
printf("04x", thread_id(pthread_self()));
2,2:
यहाँ आंशिक स्यूडोकोड उदाहरण है। बस नई धागा आईडी पंजीकृत करें।
लॉगिंग के दौरान pthread_self() कॉल करें और अगर यह थ्रेड पता है तो आंतरिक तालिका खोजें। यदि ऐसी आईडी के साथ धागा बनाया गया था तो इसकी अनुक्रमणिका का उपयोग किया जाता है (या पहले थ्रेड से पुनः उपयोग किया जाता है, वास्तव में इससे कोई फर्क नहीं पड़ता क्योंकि एक ही पल के लिए 2 समान आईडी नहीं हैं)। यदि थ्रेड आईडी अभी तक ज्ञात नहीं है, तो नई प्रविष्टि बनाई गई है इसलिए नई अनुक्रमणिका जेनरेट/प्रयुक्त होती है।
लाभ सादगी है। नुकसान धागा निर्माण/विनाश की कोई ट्रैकिंग नहीं है। तो इसे ट्रैक करने के लिए कुछ बाहरी यांत्रिकी आवश्यक है।
स्रोत
2009-11-18 23:35:14
+1। लेकिन यह समाधान अब तक pthread_t प्रतिनिधित्व उत्पन्न करता है कि यह संख्यात्मक "गैर पोर्टेबल" समाधान है। – dimba
gdb एक छोटी संख्या असाइन करता है। मैं कुछ समान समाधान – dimba
आर पेट से खुश हूं: नहीं, ऐसा नहीं है। ध्यान दें कि 'ptc' सूचक को 'fprintf' पंक्ति में संदर्भित किया गया है। – caf