এটি আমার অনুরূপ অন্য একটি অনুরূপ পোস্টে অনুলিপি করা হয়েছে, আশা করি এটি সহায়তা করতে পারে:
1) কোনও সিস্টেম সমর্থন করতে পারে সর্বাধিক সংখ্যক থ্রেড দিয়ে শুরু করুন:
int Num_Threads = thread::hardware_concurrency();
২) দক্ষ থ্রেডপুল প্রয়োগের জন্য, একবার নাম_থ্রেডস অনুসারে থ্রেড তৈরি হয়ে গেলে, নতুন তৈরি না করা বা পুরানোগুলি (যোগ দিয়ে) ধ্বংস না করাই ভাল। পারফরম্যান্স পেনাল্টি থাকবে, এমনকি আপনার অ্যাপ্লিকেশনটি সিরিয়াল সংস্করণের চেয়ে ধীর হয়ে যেতে পারে।
প্রতিটি সি ++ 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) অনন্ত_লুপ_ফানশন
টাস্কের সারিটির জন্য অপেক্ষা করা এটি "সময় (সত্য)" লুপ
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()
}