2012-07-13 21 views
7

सी ++ 11 में किसी भी विश्वसनीय तरीके से पता लगाने के लिए है कि वर्तमान धागा मुख्य धागा है या नहीं?std :: धागा मुख्य धागा का पता लगाता है

bool isMainThread() 
{ 
    return theMainThreadIdISavedOnProgramStart == std::this_thread::get_id(); 
} 

वहाँ एक आम तरीका है यह करने के लिए है: या मैं मैन्युअल std::this_thread::get_id() साथ मुख्य धागे धागा आईडी को बचाने के लिए और फिर इस तरह एक नियमित है के लिए होता है? क्या उपर्युक्त समाधान काम करेगा?

धन्यवाद

+2

आप धागे-स्थानीय भंडारण में एक ध्वज भी सेट कर सकते हैं, लेकिन मुझे यकीन नहीं है कि इस बिंदु पर टीएलएस व्यापक रूप से उपलब्ध है या नहीं। स्पष्टीकरण के लिए – dasblinkenlight

उत्तर

8

आप मुख्य थ्रेड से क्या मतलब है? यदि आपका मतलब है, थ्रेड जो main() निष्पादित करता है, तो कोई थ्रेड नहीं है कि कोई थ्रेड मुख्य धागा है या नहीं। आपको अपनी आईडी को सहेजना होगा और बाद में आप सहेजे गए आईडी को सहेज सकते हैं यह जानने के लिए कि कोई मौजूदा थ्रेड मुख्य धागा है या नहीं, सहेजी गई आईडी (जैसा कि आपने अपने प्रश्न में अनुमान लगाया है) के साथ इसकी आईडी की तुलना करके।

इसे थोड़ा और समझाने के लिए, धागे में पदानुक्रम नहीं है, कोई पैरेंट धागा नहीं है, कोई बच्चा धागा नहीं है, भले ही एक धागा अन्य धागे बनाता है। ओएस को याद नहीं है कि कौन सा थ्रेड बनाया गया था। इसलिए, सभी धागे ओएस, और आपके कार्यक्रम के लिए समान हैं। तो आप यह पता लगाकर main धागा का अनुमान नहीं लगा सकते हैं कि वर्तमान धागा आपके आवेदन में अन्य सभी धागे का अभिभावक है या नहीं।

+1

धन्यवाद! मैं वास्तव में मुख्य निष्पादन धागा का उल्लेख()! मैं आईडी को मैन्युअल रूप से सहेज दूंगा! धन्यवाद! – moka

+3

बहुत सही जवाब। एक sidenote के रूप में और प्लेटफार्म के आधार पर, फ्रीबीएसडी, ओपनबीएसडी, मैक ओएस एक्स या आईओएस चलाने वाले पॉज़िक्स प्लेटफॉर्म पर, pthread.h में एक फ़ंक्शन है - int pthread_main_np (शून्य); धागा मुख्य धागा है, तो यह शून्य शून्य देता है। यदि आपने std :: thread का उपयोग करके थ्रेड बनाया है, तो यह अंतर्निहित फ़ंक्शन सही तरीके से काम करेगा। ध्यान दें कि फ़ंक्शन के अंत में "एनपी" का अर्थ है "गैर-पोर्टेबल", फिर भी नवाज़ का सबसे अच्छा मंच-स्वतंत्र उत्तर है। – NSDestr0yer

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