मैं अपने काम के लिए बहुत सारी डिज़ाइन आवश्यकताओं के साथ थ्रेड पूल के लिए एक डिज़ाइन के साथ आने की कोशिश कर रहा हूं। यह काम करने वाले सॉफ्टवेयर के लिए एक वास्तविक समस्या है, और यह एक कठिन काम है। मेरे पास एक कार्यान्वयन कार्यान्वयन है लेकिन मैं इसे एसओ में फेंकना चाहता हूं और देख सकता हूं कि लोग किस दिलचस्प विचार के साथ आ सकते हैं, ताकि मैं अपने कार्यान्वयन की तुलना कर सकूं और देख सकूं कि यह कैसे ढेर हो जाता है। मैंने जितनी आवश्यकता हो उतनी आवश्यकताओं के लिए विशिष्ट होने की कोशिश की है।विभिन्न प्राथमिकताओं के साथ मनमानी कार्यों को निष्पादित करने के लिए थ्रेड पूल
थ्रेड पूल को कार्यों की एक श्रृंखला निष्पादित करने की आवश्यकता है। कार्य कम चल रहे हैं (< 1sec) या लंबे समय तक चलने (घंटे या दिन)। प्रत्येक कार्य में एक प्राथमिक प्राथमिकता होती है (1 = बहुत कम से 5 = बहुत अधिक)। कार्य किसी भी समय पहुंच सकते हैं जबकि अन्य कार्य चल रहे हैं, इसलिए जब वे थ्रेड पूल पहुंचते हैं तो इन्हें चुनने और उन्हें शेड्यूल करने के लिए शेड्यूल के रूप में सेट करने की आवश्यकता होती है।
कार्य प्राथमिकता कार्य लंबाई की पूरी तरह से स्वतंत्र है। असल में यह बताना असंभव है कि बिना किसी दौड़ के चलाने के लिए कितना समय लग सकता है।
कुछ कार्य सीपीयू बाध्य हैं जबकि कुछ बहुत अधिक IO बाध्य हैं। यह बता देना असंभव है कि एक दिया गया कार्य क्या होगा (हालांकि मुझे लगता है कि कार्य चल रहा है, जबकि यह पता लगाना संभव हो सकता है)।
थ्रेड पूल का प्राथमिक लक्ष्य थ्रूपुट को अधिकतम करना है। थ्रेड पूल को कंप्यूटर के संसाधनों का प्रभावी ढंग से उपयोग करना चाहिए। आदर्श रूप से, सीपीयू बाध्य कार्यों के लिए, सक्रिय धागे की संख्या CPUs की संख्या के बराबर होगी। आईओ बाध्य कार्यों के लिए, सीपीयू के मुकाबले अधिक धागे आवंटित किए जाने चाहिए ताकि ब्लॉकिंग अत्यधिक थ्रूपुट को प्रभावित न करे। ताले के उपयोग को कम करने और थ्रेड सुरक्षित/तेज़ कंटेनरों का उपयोग करना महत्वपूर्ण है।
सामान्य रूप से, आपको उच्च प्राथमिकता वाले कार्यों को उच्च CPU प्राथमिकता (रेफरी: SetThreadPriority) के साथ चलाना चाहिए। निचले प्राथमिकता वाले कार्यों को उच्च प्राथमिकता वाले कार्यों को "ब्लॉक" नहीं करना चाहिए, इसलिए यदि उच्च प्राथमिकता कार्य चल रहा है, तो उच्च प्राथमिकता कार्य चल रहा है, उच्च प्राथमिकता कार्य चलाना होगा।
कार्यों में उनके साथ जुड़े "अधिकतम चल रहे कार्य" पैरामीटर हैं। प्रत्येक प्रकार के कार्य को केवल एक समय में कार्य के इस कई समवर्ती उदाहरणों पर चलाने की अनुमति है। उदाहरण के लिए, हम कतार में निम्न कार्य हो सकता है:
- एक - 1000 उदाहरणों - कम प्राथमिकता - अधिकतम कार्य 1
- बी - 1000 उदाहरणों - कम प्राथमिकता - अधिकतम कार्य 1
- सी - 1000 उदाहरण - कम प्राथमिकता - अधिकतम कार्य 1
एक कार्य कार्यान्वयन केवल एक ही समय में (ए) 1 बी और 1 सी चला सकता है (अधिकतर)।
इसे विंडोज एक्सपी, सर्वर 2003, Vista और सर्वर 2008 (नवीनतम सर्विस पैक) पर चलाने की जरूरत है।
संदर्भ के लिए, हम निम्न इंटरफ़ेस का उपयोग हो सकता है:
namespace ThreadPool
{
class Task
{
public:
Task();
void run();
};
class ThreadPool
{
public:
ThreadPool();
~ThreadPool();
void run(Task *inst);
void stop();
};
}