これは私の答えから別の非常に類似した投稿にコピーされます。
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
これは、タスクキューを待機する「while(true)」ループです。
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));
これらの要素を統合すると、独自の動的スレッドプールができます。これらのスレッドは常に実行され、ジョブの実行を待機します。
構文エラーがある場合はお詫び申し上げます。これらのコードを入力しましたが、メモリが不良です。申し訳ありませんが、完全なスレッドプールコードを提供することはできません。これは私の仕事の完全性に違反します。
編集:プールを終了するには、shutdown()メソッドを呼び出します。
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()
}