2010-12-28 20 views
14

मैं लॉगिंग करते समय थ्रेड को एक साधारण आईडी द्वारा पहचानने में सक्षम होना चाहता हूं ताकि एक थ्रेड के निष्पादन को ढूंढना आसान हो। एपीआई GetCurrentThreadId() का उपयोग कर खिड़कियों के साथ मैं जो चाहता हूं उसे प्राप्त कर सकता हूं। boost::thread में एक विधि get_id() है लेकिन यह एक पूर्णांक की तरह एक अभिन्न मूल्य का प्रतिनिधित्व नहीं करता है। इस ऑब्जेक्ट में थ्रेड_डेटा सदस्य है जिसमें एक आईडी है जो मुझे लगता है कि मैं चाहता हूं लेकिन डेटा सदस्य निजी है इसलिए इसका उपयोग नहीं किया जा सकता है।बूस्ट आईडी को बूस्ट :: थ्रेड से कैसे पुनर्प्राप्त करें?

प्रदर्शन या पहचान उद्देश्यों के लिए थ्रेड आईडी तक पहुंचने का बढ़ावा तरीका क्या है?

उत्तर

9

बूस्ट एक operator<<(std::ostream&, const boost::thread::id&) अधिभार कि एक धारा को एक धागे आईडी लिखने के लिए इस्तेमाल किया जा सकता भी शामिल है (वास्तव में, अधिभार एक टेम्पलेट है और std::basic_ostream के किसी भी विशेषज्ञता, न सिर्फ std::ostream के साथ काम करेंगे)।

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

+0

इसलिए फ़ंक्शन के पैरामीटर के रूप में मैं बूस्ट :: थ्रेड :: आईडी को आउटपुट स्ट्रीम ऑपरेटर के साथ उपयोग करने के लिए पास करूंगा? यह सिवाय इसके कि क्या आप चाहते हैं कि मूल्य धाराओं या स्ट्रीम ऑपरेटरों के बिना उपयोग योग्य हो? – AJG85

+0

बूस्ट का उपयोग करके :: this_thread :: get_id() थ्रेड वर्क फ़ंक्शन के भीतर से वास्तव में sprintf_s शैली स्वरूपण के साथ कोई पैरामीटर आवश्यक नहीं है। – AJG85

8

आपको सदस्य फ़ंक्शन boost::thread::native_handle() का उपयोग करने की आवश्यकता है। यह एक प्रकार native_handle_type देता है जो मूल थ्रेड पहचानकर्ता के लिए कार्यान्वयन परिभाषित उपनाम है, जिसका उपयोग मूल थ्रेड एपीआई कार्यों के साथ किया जा सकता है।

boost::this_thread::get_id() 

इस विधि को बढ़ावा देने से एक आंतरिक id प्रकार देता है, कि:

+0

जबकि मुझे पता होना उपयोगी है कि मुझे थ्रेड आईडी चाहिए। बूस्ट :: थ्रेड का उपयोग करने का प्राथमिक कारण मेरे मामले में ओएस विशिष्ट कॉल से बचने के लिए है। – AJG85

+3

@ AJG85: ... और 'देशी हैंडल()' आपको * बिल्कुल * ऐसे अद्वितीय पहचानकर्ता के साथ आगे बढ़ाएगा, तो समस्या क्या है? आपको इसे किसी और चीज़ के लिए उपयोग करने की ज़रूरत नहीं है; यह केवल मूल्य का प्रतिनिधित्व करने का एक स्पष्टीकरण था; यह वास्तव में * सटीक * है जिसे आप 'GetCurrentThreadId() 'से प्राप्त करेंगे। महत्वपूर्ण रूप से यह पहचानकर्ता डीबगर की * थ्रेड * विंडो में प्रदर्शित जैसा ही होगा, इसलिए इसके मान को जानना बहु थ्रेडेड डीबगिंग में मदद कर सकता है। – Clifford

+0

अच्छा बिंदु। सिर्फ इसलिए कि इसका इस्तेमाल मूल कॉल के लिए किया जा सकता है इसका मतलब यह नहीं है कि यह केवल एक चीज है। साथ ही मेरा मानना ​​है कि यह GetCurrentThreadId() द्वारा लौटाई गई पूर्णांक आईडी के विपरीत GetCurrentThread() से प्राप्त हैंडल के बराबर है। – AJG85

39

बहुत देर हो गई है, लेकिन उन एक जवाब की तलाश में के लिए, को बढ़ावा देने धागा आईडी परामर्श करने के लिए के रूप में आप ने कहा, बस निम्न विधि बुला की अनुमति देता है जैसा आप चाहते हैं उतना संख्यात्मक नहीं है। लेकिन आप इस नंबर को आसानी से रूपांतरित कर सकते हैं, उदाहरण के लिए, एक हस्ताक्षरित लंबे समय से ध्यान में रखते हुए कि आईडी में हेक्साडेसिमल प्रतिनिधित्व है। इस छोटे समारोह डी काम करेगा:

4491075584 
4491612160 
4492148736 
4492685312 
4493221888 
4493758464 
4494295040 
4494831616 
4495368192 
4495904768 

boost_thread और boost_system साथ लिंक को न भूलें:

#include <boost/lexical_cast.hpp> 
#include <boost/thread.hpp> 

unsigned long getThreadId(){ 
    std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id()); 
    unsigned long threadNumber = 0; 
    sscanf(threadId.c_str(), "%lx", &threadNumber); 
    return threadNumber; 
} 

void drawThreadId(){ 
    std::cout << getThreadId() << std::endl; 
    boost::this_thread::sleep(boost::posix_time::milliseconds(500)); 
} 

int main() { 
    for(int i=0; i<10; i++){ 
     boost::thread thread = boost::thread(drawThreadId); 
    } 
    return 0; 
} 

यह कुछ इस तरह वापस आ जाएगी।

आशा है कि इससे मदद मिलती है!

+0

+1 धन्यवाद, यही वह है जिसे मैं ढूंढ रहा था! – Avio

+0

मैं थ्रेड ऑब्जेक्ट से आईडी कैसे प्राप्त करूं? ('बूस्ट :: थ्रेड मिथ्रेड') –

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