線程池用於管理線程,透過維護預先分配的線程池來減少線程開銷。具體場景包括:減少執行緒建立和銷毀開銷;管理並發性,防止資源耗盡;提高程式碼簡潔性,消除執行緒管理細節。
C++ 多執行緒程式設計中執行緒池的使用場景
執行緒池是一種管理執行緒的機制,它可以提高多執行緒程式設計的效率和效能。在 C++ 中,可以透過使用 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
函數加入到任務佇列中。執行緒池中的執行緒持續不斷地從任務佇列中取得任務並執行它們。當任務佇列為空時,執行緒會等待條件變數被通知,表示有新任務可用。
輸出如下:
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
以上是C++ 多執行緒程式設計中執行緒池的使用場景有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!