C 11 のスレッド プーリング
課題:
スレッドの作成と管理は、特に次の場合にコストがかかる可能性があります。タスクごとに繰り返されます。スレッド作成のオーバーヘッドを避けて、複数のタスクをスレッドのプールに送信できるスレッド プールを作成するにはどうすればよいですか?
答え:
スレッドの実装C 11 のプールには、タスクを実行するために再利用できるスレッドのコレクションを管理するクラスの作成が含まれます。以下に主要な側面の内訳を示します:
ThreadPool クラスの実装:
ThreadPool クラスは、スレッド プールを作成、管理、停止するためのインターフェイスを定義します。
1. ThreadPool::Start:
指定された数のスレッドを作成してスレッド プールを初期化します。これらのスレッドは無限ループを実行し、タスクを待機します。
2. ThreadPool::ThreadLoop:
プール内の各スレッドが実行する無限ループ。新しいタスクを継続的にチェックして実行し、終了が通知されるまで繰り返します。
3. ThreadPool::QueueJob:
スレッド プール キューにタスクを追加します。タスクは、実行する作業を定義する関数オブジェクトです。
4. ThreadPool::busy:
スレッド プールに保留中のタスクがあるかどうかを確認します。
5. ThreadPool::Stop:
スレッド プールを終了し、すべてのスレッドが現在のタスクを完了するのを待ちます。
ThreadPool の統合:
ThreadPool クラスが定義されているので、次のように使用できます。
thread_pool->QueueJob([] { /* ... */ });
例:
std::vector<std::thread> workers; int total = 4; int arr[4] = {0}; void each_thread_does(int i) { arr[i] += 2; } int main() { // ThreadPool Example ThreadPool thread_pool; thread_pool.Start(); for (int i = 0; i < 8; ++i) { for (int j = 0; j < 4; ++j) { thread_pool.QueueJob(std::bind(each_thread_does, j)); } } // Wait for the thread pool to complete while (thread_pool.busy()) {} thread_pool.Stop(); arr[4] = std::min_element(arr, arr + 4); return 0; }
この例では、提供されたクラスを使用してスレッド プールを作成し、スレッド プールを使用せずに複数のタスクをプールに送信する方法を示します。スレッドの作成と削除を繰り返す必要があります。
以上がC 11 スレッド プールはどのようにしてタスク管理を改善し、オーバーヘッドを削減できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。