2012-03-21 8 views
6

असाइन करें। मेरे पास .NET 4 में एक विंडोज सेवा है जो समय-समय पर थ्रेड का उपयोग करके नौकरियां कर रही है। सर्वर में 20 से अधिक सीपीयू कोर हैं।प्रत्येक थ्रेड को एक सीपीयू कोर

मैं अपनी विंडोज सेवा में 10 धागे बनाते हैं। क्या प्रत्येक थ्रेड को एक सीपीयू कोर असाइन करना संभव है?

+2

आप ओएस शेड्यूलर/प्रेषक का दूसरा अनुमान क्यों लगाएंगे? इस तरह के अभ्यास शायद ही कभी खत्म हो जाते हैं। –

+0

@ मार्टिन: जिज्ञासा और जिज्ञासा और जिज्ञासा – ehsan

+0

अधिक लगता है "मेरे पास कोई सुराग नहीं है" – TomTom

उत्तर

7

ओएस पहले से ही आपके लिए ठीक है। यह गारंटी नहीं देता है कि प्रत्येक थ्रेड एक ही कोर पर हमेशा के लिए रहेंगे (और लगभग सभी मामलों में, इसके लिए कोई आवश्यकता नहीं है), लेकिन जितना संभव हो उतना कोर व्यस्त रखने की कोशिश करता है। जिसका मतलब है कि सभी उपलब्ध धागे जितना संभव हो उतना कोर अपने स्वयं के कोर दे रहे हैं।

+0

अच्छा! क्या इस दावे के लिए कोई आधिकारिक दस्तावेज है? – ehsan

+0

बहुत संभावना है, लेकिन मुझे यकीन नहीं है कि इसे कहां मिलना है, जैसे कि मुझे यह सुनिश्चित नहीं होगा कि दावे के लिए दस्तावेज़ीकरण कहां मिलेगा कि ओएस अचानक आपकी प्रक्रिया 'स्मृति स्थान को फिर से लिख नहीं पाएगा। यह ऑपरेटिंग सिस्टम 101 है। एक ओएस जो सभी CPU कोरों का उपयोग करने की कोशिश नहीं करता * मूल रूप से टूटा हुआ है। – jalf

+0

से आधा: मैंने कुछ दस्तावेज पढ़े और मैं समझता हूं कि आप सही हैं! – ehsan

6

मूल Win32 सिस्टम कॉल, विशेष रूप से SetThreadAffinityMask में टैप करके संभव है। (बेशक, मुखौटा के लिए एक अलग पैरामीटर के साथ) के अंदर प्रत्येक थ्रेड पैदा की

[DllImport("kernel32.dll")] 
static extern IntPtr GetCurrentThread(); 
[DllImport("kernel32.dll")] 
static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask); 

और फिर उन्हें इस्तेमाल:: आप कुछ DllImports करने की आवश्यकता होगी

// set affinity of current thread to the given cpuID 
SetThreadAffinityMask(GetCurrentThread(), new IntPtr(1 << (int)cpuID)); 

चेतावनी: नेट के बीच सीधा संबंध धागे और ओएस धागे कम से कम इस के अनुसार, इसकी गारंटी नहीं है: http://msdn.microsoft.com/en-us/library/74169f59.aspx

एक ऑपरेटिंग सिस्टम threadid एक प्रबंधित धागा करने के लिए कोई निश्चित संबंध नहीं है, क्योंकि एक यू nmanaged मेजबान प्रबंधित और अप्रबंधित धागे के बीच संबंधों को नियंत्रित कर सकते हैं। विशेष रूप से, एक परिष्कृत मेजबान उसी ऑपरेटिंग सिस्टम थ्रेड के विरुद्ध कई प्रबंधित थ्रेड शेड्यूल करने के लिए फाइबर एपीआई का उपयोग कर सकता है, या विभिन्न ऑपरेटिंग सिस्टम थ्रेड के बीच प्रबंधित थ्रेड को स्थानांतरित करने के लिए उपयोग कर सकता है।

+1

-1। एक .NET थ्रेड एक ओएस स्तर धागा है। रेडोग्रामर डाउनराड अलगाव जैसी चीजें सेट करने में सक्षम होने के लिए नीचे। जब तक एमएस इसे एक बड़े .NET रनटाइम अपग्रेड में नहीं करता है, तब तक यह बहुत अधिक गारंटीकृत है। – TomTom

+0

@ टॉमटॉम: मुझे पूरा यकीन है कि आप जो कह रहे हैं वह .NET के सभी संस्करणों के लिए मान्य नहीं है। यहां पढ़ें: http://msdn.microsoft.com/en-us/library/74169f59.aspx। मैंने अपनी पोस्ट में उद्धरण भी जोड़ा। – Tudor

+0

और बीटीडब्ल्यू, मुझे लगता है कि मैंने अपने प्रश्न का उत्तर दिया है, इसलिए मुझे अंत में एक बहस योग्य वाक्य के लिए डाउनवोट करने का कारण नहीं दिख रहा है। – Tudor

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