スレッド プールは、事前に割り当てられたスレッド プールを維持することでスレッドを管理し、スレッドのオーバーヘッドを削減するために使用されます。具体的なシナリオには、スレッドの作成と破棄のオーバーヘッドを削減すること、リソースの枯渇を防ぐための同時実行性の管理、コードの簡素化の改善、およびスレッド管理の詳細の排除が含まれます。
C++ マルチスレッド プログラミングにおけるスレッド プールの使用シナリオ
スレッド プールは、マルチスレッド プログラミングの効率とパフォーマンスを向上させることができるスレッドを管理するメカニズムです。 C++ では、std::thread
や std::condition_variable
などの標準ライブラリを使用してスレッド プールを実装できます。 std::thread
和 std::condition_variable
等标准库来实现线程池。
以下是一些使用线程池的常见场景:
实战案例
以下是一个使用 std::thread
和 std::condition_variable
在 C++ 中实现线程池的示例:
#include <condition_variable> #include <iostream> #include <mutex> #include <queue> #include <thread> #include <vector> using namespace std; // 线程池类 class ThreadPool { public: ThreadPool(int num_threads) : stop(false) { // 创建指定数量的线程并将其添加到线程池 for (int i = 0; i < num_threads; i++) { threads.emplace_back([this] { while (!stop) { unique_lock<mutex> lock(mtx); if (!tasks.empty()) { // 从任务队列中获取任务 auto task = tasks.front(); tasks.pop(); // 执行任务 task(); // 通知条件变量任务已完成 cv.notify_one(); } else { // 如果任务队列为空,则等待新任务 cv.wait(lock); } } }); } } ~ThreadPool() { // 停止所有线程 stop = true; cv.notify_all(); // 等待所有线程完成 for (auto& thread : threads) { thread.join(); } } // 向任务队列添加任务 void enqueue(function<void()> &&task) { unique_lock<mutex> lock(mtx); tasks.push(move(task)); // 通知条件变量有新任务 cv.notify_one(); } private: bool stop; // 线程池停止标志 mutex mtx; // 用于保护任务队列和条件变量 condition_variable cv; // 用于等待新任务 queue<function<void()>> tasks; // 任务队列 vector<thread> threads; // 线程池中的线程 }; int main() { // 创建具有 4 个线程的线程池 ThreadPool pool(4); // 向线程池添加 10 个任务 for (int i = 0; i < 10; i++) { pool.enqueue([i] { cout << "Task " << i << " executed by thread " << this_thread::get_id() << endl; }); } return 0; }
在这个例子中,我们创建了一个 ThreadPool
类,它维护一个预先分配的线程池。任务通过 enqueue
std::thread
と std::condition_variable
を使用してスレッド プールを実装する例です。 C++ の場合:🎜Task 0 executed by thread 139670130218816 Task 1 executed by thread 139670129941952 Task 2 executed by thread 139670130082240 Task 3 executed by thread 139670130226176 Task 4 executed by thread 139670129949696 Task 5 executed by thread 139670130233920 Task 6 executed by thread 139670129957440 Task 7 executed by thread 139670130090080 Task 8 executed by thread 139670130241664 Task 9 executed by thread 139670129965184🎜 この例では、事前に割り当てられたスレッド プールを維持する
ThreadPool
クラスを作成します。タスクは、enqueue
関数を通じてタスク キューに追加されます。スレッド プール内のスレッドは、タスク キューからタスクを継続的に取得して実行します。タスク キューが空の場合、スレッドは、新しいタスクが使用可能であることが条件変数に通知されるまで待機します。 🎜🎜出力は次のようになります: 🎜rrreee以上がC++ マルチスレッド プログラミングにおけるスレッド プールの使用シナリオは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。