2016-01-16 3 views
17

विजुअल स्टूडियो 2015 के साथ, एक नया, रिक्त सी ++ परियोजना में, कंसोल आवेदन के लिए निम्नलिखित का निर्माण:विंडोज 10 मेरे कार्यक्रम में अतिरिक्त धागे क्यों शुरू करता है?

int main() { 
    return 0; 
} 

वापसी पर एक को तोड़ने बिंदु सेट और डीबगर में कार्यक्रम शुरू। विंडोज 7 पर, ब्रेक पॉइंट के रूप में, इस प्रोग्राम में केवल एक थ्रेड है। लेकिन विंडोज 10 पर, इसमें पांच (!) धागे हैं: मुख्य धागा और चार "कार्यकर्ता थ्रेड" सिंक्रनाइज़ेशन ऑब्जेक्ट पर प्रतीक्षा कर रहे हैं।

थ्रेड पूल (या मैं कैसे पता लगा सकता हूं) शुरू कर रहा है?

+0

यहां विंडोज और अंतहीन लूप के बारे में मजा आता है ... –

+0

शायद विंडोज़ 10 पर डिफ़ॉल्ट रूप से थ्रेड पूल प्राप्त करें। –

+1

मैं 'CreateThread पर ब्रेकपॉइंट डालकर शुरू करूंगा '। ध्यान दें कि नाम से ब्रेकपॉइंट्स को विंडबग का उपयोग करना बहुत आम है, जबकि विजुअल स्टूडियो डीबगर में यह संभव है लेकिन कुछ असामान्य मेनू कमांड सीखना आवश्यक है। –

उत्तर

17

क्रिस्टल बॉल का कहना है कि डीबग> विंडोज> थ्रेड विंडो इन धागे को ntdll.dll!TppWorkerThread पर दिखाती है। इसे स्वयं देखने के लिए Microsoft Symbol Server को सक्षम करना सुनिश्चित करें, उपकरण> विकल्प> डिबगिंग> प्रतीकों का उपयोग करें।

यह वीएस2013 में भी होता है, इसलिए यह निश्चित रूप से नई वीएस2015 डायग्नोस्टिक सुविधाओं के कारण नहीं होता है, @ एडम का अनुमान सही नहीं हो सकता है।

TppWorkerThread() थ्रेड-पूल थ्रेड के लिए एंट्री पॉइंट है। जब मैंने डीबग> न्यू ब्रेकपॉइंट> फ़ंक्शन ब्रेकपॉइंट के साथ इस फ़ंक्शन पर ब्रेकपॉइंट सेट किया।

[email protected]() Unknown 
    ntdll.dll!LdrpMapDllNtFileName() Unknown 
    ntdll.dll!LdrpMapDllSearchPath() Unknown 
    ntdll.dll!LdrpProcessWork() Unknown 
    [email protected]() Unknown 
    ntdll.dll!TppWorkpExecuteCallback() Unknown 
    ntdll.dll!TppWorkerThread() Unknown 
    [email protected]@12() Unknown 
    ntdll.dll!__RtlUserThreadStart() Unknown 
> [email protected]() Unknown 

जाहिर लोडर Windows 10 पर ThreadPool उपयोग कर रहा है DLLs लोड करने के लिए: जब 2 ThreadPool धागे को क्रियान्वित करने शुरू कर दिया मैं 1 ThreadPool धागे के लिए इस स्टैक ट्रेस कब्जा करने के लिए भाग्यशाली। यह निश्चित रूप से नया है :) इस बिंदु पर मुख्य धागा लोडर में काम कर रहा है, काम पर समेकन।

तो विंडोज 10 प्रक्रिया शुरू करने के लिए कई कोर का लाभ उठा रही है। बहुत अधिक सुविधा, एक बग नहीं :)

+0

सवाल यह है कि क्या विंडोज 10/नए विंडोज संस्करण प्रक्रिया प्रारंभिकरण से परे अतिरिक्त धागे का उपयोग करने की स्वतंत्रता लेते हैं? कुछ कार्यक्रम वास्तव में प्रदर्शन के लिए धागे की कुछ मात्रा (जैसे वेब सर्वर) पर निर्भर करता है .. –

+1

स्पष्ट रूप से उत्तर * हां * है। थ्रेडपूल को वेब सर्वर पर बहुत से अन्य उपयोग मिलते हैं, ये "बर्बाद" थ्रेड नहीं होते हैं। मैंने विंडोज 10 बीटीडब्ल्यू के वर्कस्टेशन संस्करण पर इसका परीक्षण किया, विंडोज सर्वर 2016 अभी भी पूर्वावलोकन में अभी भी है। –

+2

मेरा प्रश्न है: मान लें कि मैंने अपना सर्वर प्रोफाइल किया है और मैंने देखा है कि 5 धागे सबसे अधिक प्रदर्शन लाते हैं। क्या विंडोज़ के नए संस्करण पहले से बनाए गए लोगों से अधिक धागे का उपयोग करने की स्वतंत्रता ले सकते हैं? मैं वेब सर्वर पर थ्रेडपूल के उपयोग से नहीं पूछ रहा हूं, लेकिन यहां आप जो मुद्दा प्रस्तुत कर रहे हैं, जो "मेरे प्रोग्राम में अवांछित ओएस धागे" –

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