2012-12-10 21 views
14

कहें, अगर मेरे पास थ्रेड आईडी है, तो क्या मुझे आश्वासन दिया जा सकता है कि यह प्रति प्रक्रिया या पूरे ओएस (उपयोगकर्ताओं में लॉग इन के बीच) के लिए अद्वितीय होगा (जब तक थ्रेड चल रहा है)?क्या थ्रेड आईडी प्रति प्रक्रिया या प्रति कंप्यूटर अद्वितीय हैं?

+0

एक बार जब आप जानते हैं कि एक थ्रेड अपने जीवनकाल के दौरान अलग-अलग कोर/प्रोसेसर पर चल सकता है और आईडी उस समय के दौरान स्थिर रहेगी, तो आप स्वयं को जवाब घटा सकते हैं ;-) –

उत्तर

11

हाँ, विंडोज़ पर थ्रेड आईडी और प्रोसेस आईडी को उसी पूल से आवंटित किया जाता है, इसलिए वे अद्वितीय होंगे। एक बार थ्रेड या प्रक्रिया समाप्त होने के बाद, आईडी को किसी अन्य थ्रेड या प्रक्रिया द्वारा दोबारा उपयोग किया जा सकता है।

+2

हाँ, धन्यवाद। मुझे पता है कि पीआईडी ​​अद्वितीय हैं। मुझे थ्रेड आईडी के बारे में निश्चित नहीं था। – c00000fd

+0

क्या आप अपने उत्तर का विस्तार करने के लिए विस्तार कर सकते हैं कि कितनी बार थ्रेड आईडी या प्रोसेस आईडी रीसाइक्ल हो जाते हैं? –

+0

@ क्रिस्टोफरऑज़बेक जैसे ही कर्नेल ऑब्जेक्ट बंद हो जाता है, इसकी आईडी का पुन: उपयोग किया जा सकता है। तो निम्नलिखित पूरी तरह से संभव है: 'hThread1 = CreateThread (... &tid1); CloseHandle (hThread1); hThread2 = CreateThread (... &tid2); // tid1 == tid2, यहां तक ​​कि hThread1 == hThread2' हालांकि वे अब एक अलग कर्नेल का संदर्भ लेते हैं ऑब्जेक्ट। – parrowdice

8

एक थ्रेड को कर्नेल ऑब्जेक्ट द्वारा दर्शाया गया है उदा। विंडोज मंच पर। इसलिए यह आईडी सभी लॉगऑन सत्रों में सभी प्रक्रियाओं में अद्वितीय होगी। हालांकि थ्रेड कर्नेल ऑब्जेक्ट बंद होने के बाद थ्रेड आईडी को पुनर्नवीनीकरण किया जा सकता है।

GetCurrentThreadId चलते समय अद्वितीय आईडी के बारे में भी स्पष्ट रूप से कहता है।

+0

धन्यवाद। थ्रेड आईडी रीसाइक्लिंग के खिलाफ सुरक्षा के लिए (अगर थ्रेड और उसके हैंडल को बंद किया जा सकता है, तो इस थ्रेड आईडी को ट्रैक किया जा सकता है) कोई इसे थ्रेड सृजन FILETIME के ​​साथ जोड़ सकता है, जिसे GetThreadTimes() API के साथ प्राप्त किया जा सकता है। – c00000fd

+0

@ user843732 : सही तरीके से हो गया, हां आप कर सकते हैं। मैं उस तकनीक का उपयोग यह जांचने के लिए करता हूं कि किसी प्रक्रिया के माता-पिता पीआईडी ​​ने अपनी मूल प्रक्रिया बनाम एक प्रक्रिया को इंगित किया है जिसने अपने माता-पिता के पीआईडी ​​को पुनर्नवीनीकरण किया है। – parrowdice

+0

@parrowdice: एक अनुवर्ती प्रश्न, दोस्तों। GetThreadTimes() एपीआई द्वारा लौटाई गई 'FILETIME' समय में कोई टाइमर-संबंधित "जिटर" नहीं है, क्या यह है? दस्तावेज़ों का दावा है कि थ्रेड सृजन का मूल्य "100-नैनोसेकंड टी" में व्यक्त किया गया है ime इकाइयों "जो एक भयानक सटीक है! यह आंतरिक टाइमर को उस एपीआई के अलग-अलग कॉल के लिए इसे शुरू करने का कारण नहीं देगा, है ना? – c00000fd

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