यह मेरे जवाब से एक और बहुत ही समान पोस्ट पर कॉपी किया गया है, आशा है कि यह मदद कर सकता है:
1) एक प्रणाली का समर्थन कर सकते हैं धागे की अधिकतम संख्या के साथ शुरू करें:
int Num_Threads = thread::hardware_concurrency();
2) एक कुशल थ्रेडपूल कार्यान्वयन के लिए, एक बार थ्रेड्स को Num_Threads के अनुसार बनाया जाता है, यह बेहतर है कि नए को न बनाएं, या पुराने लोगों को नष्ट न करें (शामिल होकर)। प्रदर्शन पेनल्टी होगी, हो सकता है कि आपका आवेदन धारावाहिक संस्करण की तुलना में धीमा हो जाए।
प्रत्येक C ++ 11 थ्रेड को एक अनंत लूप के साथ अपने फ़ंक्शन में चलना चाहिए, लगातार नए कार्यों को हथियाने और चलाने के लिए इंतजार करना चाहिए।
इस तरह के फ़ंक्शन को थ्रेड पूल से कैसे जोड़ा जाए:
int Num_Threads = thread::hardware_concurrency();
vector<thread> Pool;
for(int ii = 0; ii < Num_Threads; ii++)
{ Pool.push_back(thread(Infinite_loop_function));}
3) Infinite_loop_function
यह एक "जबकि (सच्चा)" लूप है जो कार्य कतार की प्रतीक्षा कर रहा है
void The_Pool:: Infinite_loop_function()
{
while(true)
{
{
unique_lock<mutex> lock(Queue_Mutex);
condition.wait(lock, []{return !Queue.empty() || terminate_pool});
Job = Queue.front();
Queue.pop();
}
Job(); // function<void()> type
}
};
4) अपनी कतार में नौकरी जोड़ने के लिए एक फ़ंक्शन बनाएं
void The_Pool:: Add_Job(function<void()> New_Job)
{
{
unique_lock<mutex> lock(Queue_Mutex);
Queue.push(New_Job);
}
condition.notify_one();
}
5) अपने कतार में एक मनमाना कार्य बाँधें
Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object));
एक बार जब आप इन सामग्रियों को एकीकृत कर लेते हैं, तो आपका अपना गतिशील थ्रेडिंग पूल होता है। ये सूत्र हमेशा चलते हैं, नौकरी करने के लिए इंतजार करते हैं।
यदि कुछ वाक्यविन्यास त्रुटियां हैं, तो मैं माफी मांगता हूं, मैंने इन कोड को टाइप किया है और मेरे पास एक खराब मेमोरी है। क्षमा करें कि मैं आपको पूर्ण थ्रेड पूल कोड प्रदान नहीं कर सकता, जो मेरी नौकरी की अखंडता का उल्लंघन होगा।
संपादित करें: पूल को समाप्त करने के लिए, शटडाउन () विधि को कॉल करें:
XXXX::shutdown(){
{
unique_lock<mutex> lock(threadpool_mutex);
terminate_pool = true;} // use this flag in condition.wait
condition.notify_all(); // wake up all threads.
// Join all threads.
for(std::thread &every_thread : thread_vector)
{ every_thread.join();}
thread_vector.clear();
stopped = true; // use this flag in destructor, if not set, call shutdown()
}