C++线程池模式

  1. 1 简介: 线程池是一种常用的并发设计模式,用于管理和调度多个线程进行任务处理。线程池通过预先创建一组线程,并维护一个任务队列,从任务队列中获取任务并分配给空闲的线程执行,以提高系统的性能和资源利用率。

  2. 2 实现步骤: 以下是使用C++实现线程池模式的步骤:

    a. 定义任务类:首先,定义一个任务类,该类包含待执行的任务逻辑和数据。

    class Task {
    public:
        void execute() {
            // 任务的执行逻辑
        }
    };
    

    b. 实现线程池类:创建一个线程池类,该类包含线程池的管理和调度逻辑。

    class ThreadPool {
    private:
        std::vector<std::thread> threads;
        std::queue<Task> tasks;
        std::mutex mutex;
        std::condition_variable condition;
        bool stop;
    
    public:
        ThreadPool(size_t numThreads) : stop(false) {
            for (size_t i = 0; i < numThreads; ++i) {
                threads.emplace_back([this] {
                    while (true) {
                        std::unique_lock<std::mutex> lock(mutex);
                        condition.wait(lock, [this] { return stop || !tasks.empty(); });
    
                        if (stop && tasks.empty()) {
                            return;
                        }
    
                        Task task = std::move(tasks.front());
                        tasks.pop();
    
                        lock.unlock();
    
                        task.execute();
                    }
                });
            }
        }
    
        ~ThreadPool() {
            {
                std::unique_lock<std::mutex> lock(mutex);
                stop = true;
            }
    
            condition.notify_all();
    
            for (std::thread& thread : threads) {
                thread.join();
            }
        }
    
        void enqueueTask(const Task& task) {
            {
                std::unique_lock<std::mutex> lock(mutex);
                tasks.push(task);
            }
    
            condition.notify_one();
        }
    };
    

    3 示例代码: 以下是一个使用线程池模式的示例代码:

    #include <iostream>
    
    int main() {
        // 创建线程池对象
        ThreadPool threadPool(4);
    
        // 添加任务到线程池
        for (int i = 0; i < 10; ++i) {
            threadPool.enqueueTask(Task());
        }
    
        // 等待任务执行完成
        std::this_thread::sleep_for(std::chrono::seconds(5));
    
        return 0;
    }
    

  3. 上述代码中,客户端可以创建线程池对象并将任务添加到线程池中,线程池会自动调度线程执行任务。

  4. 4 优点:

    • 降低系统的开销:通过重用线程和任务队列的方式,减少了线程的创建和销毁的开销。
    • 提高系统的性能:线程池中的线程可以并行执行多个任务,从而提高了系统的响应速度和吞吐量。
  5. 5 注意事项:

    • 在使用线程池时,需要注意任务的线程安全性和资源竞争问题。
    • 确定线程池中线程的数量,根据系统的负载和需求进行调整。

猜你喜欢

转载自blog.csdn.net/qq_36541069/article/details/132321694
今日推荐