Le pool de threads est utilisé pour gérer les threads et réduire la surcharge des threads en maintenant un pool de threads pré-alloué. Les scénarios spécifiques incluent : la réduction des frais de création et de destruction de threads ; la gestion de la concurrence pour éviter l'épuisement des ressources ; l'amélioration de la simplicité du code et l'élimination des détails de gestion des threads.
Scénarios d'utilisation des pools de threads dans la programmation multithread C++
Le pool de threads est un mécanisme de gestion des threads, qui peut améliorer l'efficacité et les performances de la programmation multithread. En C++, les pools de threads peuvent être implémentés à l'aide de bibliothèques standard telles que std::thread
et 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
et std::condition_variable
pour implémenter un pool de threads en 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
qui maintient un pool de threads pré-alloué. Les tâches sont ajoutées à la file d'attente des tâches via la fonction enqueue
. Les threads du pool de threads obtiennent en permanence des tâches de la file d’attente des tâches et les exécutent. Lorsque la file d'attente des tâches est vide, le thread attend que la variable de condition soit avertie qu'une nouvelle tâche est disponible. 🎜🎜Le résultat ressemble à ceci : 🎜rrreeeCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!