Sobes.tech
Junior — Middle

Quelle est la différence entre l'utilisation d'un pool de threads et la création de nouveaux threads directement lorsque cela est nécessaire?

sobes.tech IA

Réponse de l'IA

La principale différence entre l'utilisation d'un pool de threads et la création de nouveaux threads à la demande:

  • Création de nouveaux threads à la demande : chaque fois, un nouveau thread est créé, ce qui est coûteux en temps et en ressources, surtout avec un grand nombre de tâches.
  • Pool de threads : un nombre fixe de threads est créé à l'avance, qui sont réutilisés pour exécuter des tâches. Cela réduit les coûts de création et de destruction des threads, améliore la performance et la gestion.

Exemple en C++ utilisant un pool de threads (simplifié):

#include <thread>
#include <vector>
#include <queue>
#include <functional>
#include <condition_variable>
#include <mutex>
#include <atomic>

class ThreadPool {
    std::vector<std::thread> workers;
    std::queue<std::function<void()>> tasks;
    std::mutex queue_mutex;
    std::condition_variable condition;
    std::atomic<bool> stop;

public:
    ThreadPool(size_t threads) : stop(false) {
        for(size_t i = 0; i < threads; ++i) {
            workers.emplace_back([this] {
                while(true) {
                    std::function<void()> task;
                    {
                        std::unique_lock<std::mutex> lock(this->queue_mutex);
                        this->condition.wait(lock, [this]{ return this->stop || !this->tasks.empty(); });
                        if(this->stop && this->tasks.empty())
                            return;
                        task = std::move(this->tasks.front());
                        this->tasks.pop();
                    }
                    task();
                }
            });
        }
    }

    void enqueue(std::function<void()> task) {
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            tasks.push(std::move(task));
        }
        condition.notify_one();
    }

    ~ThreadPool() {
        stop = true;
        condition.notify_all();
        for(std::thread &worker : workers)
            worker.join();
    }
};

Ainsi, le pool de threads optimise l'utilisation des ressources et augmente l'efficacité du traitement multithread.