2008-10-02 17 views
6

मैं यह सुनिश्चित करना चाहता हूं कि एक थ्रेड को एक विशिष्ट CPU कोर में ले जाया गया हो और शेड्यूलर द्वारा इसे कभी भी स्थानांतरित नहीं किया जा सके।Win32 पर आप थ्रेड को किसी अन्य CPU कोर पर कैसे ले जाते हैं?

एक SetThreadAffinityMask() कॉल नहीं है लेकिन कोई GetThreadAffinityMask() है।

कारण मैं की जरूरत है इस वजह से उच्च संकल्प टाइमर में गड़बड़ हो जाएगी अगर अनुसूचक एक और सीपीयू है कि धागा ले जाता है।

+0

आप * की जरूरत नहीं है * GetThreadAffinityMask(), केवल SetThreadAffinityMask()। –

उत्तर

9

आपको शायद SetThreadAffinityMask का उपयोग करना चाहिए और विश्वास है कि यह काम कर रहा है।

MSDN

+0

ध्यान दें कि GetThreadAffinityMask मौजूद नहीं है ... – bltxd

3

क्या केन ने कहा। लेकिन अगर आपको विश्वास नहीं है कि यह काम कर रहा है, तो आप SetThreadAffinityMask को दोबारा कॉल कर सकते हैं, और पुष्टि कर सकते हैं कि वापसी मूल्य उस मास्क से मेल खाता है जो आप मुखौटा होने की अपेक्षा करते हैं। (लेकिन तब निश्चित रूप से, अगर आप समारोह तो विश्वास नहीं करते आप दूसरी कॉल पर भरोसा नहीं कर सकते हैं ...)

GetProcessAffinityMask के अस्तित्व से भ्रमित नहीं होना है। यह फ़ंक्शन यह सत्यापित करने के लिए नहीं है कि SetProcessAffinityMask ने काम किया, लेकिन उदा। इसलिए आप एक थ्रेड एफ़िनिटी बना सकते हैं जो प्रक्रिया एफ़िनिटी का सबसेट है।

बस वापसी मूल्य देखें और सत्यापित करें कि यह 0 नहीं है और आपको ठीक होना चाहिए।

1

थ्रेड AffinityMask जाओ के लिए कोई जरूरत नहीं है। बस प्रक्रिया एफ़िनिटीमास्क प्राप्त करने का मान प्राप्त करें, कुछ बिट्स बंद करें, फिर SetThreadAffinityMask को कॉल करें। धागे प्रक्रिया 'एफ़िनिटी मास्क' का उत्तराधिकारी है, और चूंकि उनका संबंध आपके नियंत्रण में है, आप पहले से ही थ्रेड के एफ़िनिटी मास्क को जानते हैं (यह वह है जिसे आपने इसे सेट किया है)।

4

आप एक समारोह है कि एक संख्या का संकेत क्या सीपीयू धागे पर चल रहा है, आत्मीयता का उपयोग किए बिना रिटर्न कह सकते हैं, तो इसका जवाब अक्सर जैसे ही समारोह लौटे रूप में गलत होगा। इसलिए SetThreadAffinityMask() द्वारा लौटा गया मुखौटा जांचना उतना करीब है जितना आप प्राप्त करने जा रहे हैं, कर्नेल कोड के बाहर ऊंचे आईआरक्यूएल पर चल रहे हैं, और even that's changing

ऐसा लगता है कि आप की तरह चारों ओर RDTSC घड़ी तिरछा मुद्दों काम करने के लिए कोशिश कर रहे हैं। आप RDTSC अनुदेश सीधे उपयोग कर रहे हैं, बजाय QueryPerformanceCounter() बुला पर विचार करें:

  • QueryPerformanceCounter() Windows Vista पर HPET का उपयोग करता है अगर यह चिपसेट के द्वारा समर्थित और इस प्रणाली की ACPI टेबल में है।
  • एएमडी आधारित AMD Processor Driver का उपयोग कर ज्यादातर मल्टी कोर घड़ी तिरछा अगर आप QueryPerformanceCounter() फोन के लिए क्षतिपूर्ति करेगा प्रणाली है, लेकिन इस अनुप्रयोग जो RDTSC सीधे का उपयोग के लिए कुछ नहीं करता है। AMD Dual-Core Optimizer उन अनुप्रयोगों के लिए एक हैक है जो सीधे RDTSC का उपयोग करते हैं, लेकिन यदि सी 1 घड़ी रैंपिंग (जहां घड़ी की गति सी 1 पावर स्थिति में कम हो जाती है) के कारण घड़ी की कमी बदलती है, तो आपके पास अभी भी घड़ी की कमी होगी। और ये सुविधाएं शायद बहुत व्यापक नहीं हैं, इसलिए QueryPerformanceCounter() के साथ संबंध का उपयोग करना अभी भी एक अच्छा विचार है।
संबंधित मुद्दे