简易线程池实现(C++)

 

#include <vector>
#include <queue>
#include <thread>
#include <functional>
#include <mutex>
using namespace std;

class ThreadPool {
public:
    static const int InitThreadsSize = 3; // 线程池大小
    typedef function<void()> Task;

    ThreadPool(); // 构造函数
    ~ThreadPool(); // 析构函数
    void start(); // 启动线程池,创建一定数量的线程,进行线程循环
    void stop(); // 终止线程池,停止所有线程循环,回收所有资源
    void addTask(const Task&); // 向任务队列中添加任务

private:
    void threadLoop(); // 进行线程循环
    Task take(); // 从任务队列中取任务

    typedef vector<std::thread*> Threads; 
    typedef vector<Task> Tasks;
    Threads m_threads; // 线程数组
    Tasks m_tasks; // 任务队列 m_tasks
    mutex m_mutex; // 互斥锁
    condition_variable m_cond; // 条件变量
    bool m_isStarted; // 线程池启动标志位
};


// 构造函数
ThreadPool::ThreadPool():m_mutex(),m_cond(),m_isStarted(false) {}

// 析构函数
ThreadPool::~ThreadPool() {
    if (m_isStarted) stop(); // 终止线程池
}

// 启动线程池
void ThreadPool::start() {
    m_isStarted = true; // 启动标志位
    m_threads.reserve(InitThreadsSize); // 为线程数组预留空间
    for (int i = 0; i < InitThreadsSize; ++i) {
        // 新建线程并添加到线程数组中
        m_threads.push_back(new thread(bind(&ThreadPool::threadLoop, this)));
    }
}

// 终止线程池
void ThreadPool::stop() {
    {
        unique_lock<mutex> lock(m_mutex);
        m_isStarted = false;
        m_cond.notify_all(); // 通知所有等待线程,线程池已经终止
    }
    for (Threads::iterator it = m_threads.begin(); it != m_threads.end(); ++it) {
        (*it)->join(); // 阻塞进程直到线程执行完毕
        delete* it;
    }
    m_threads.clear();
}

// 进行线程循环
void ThreadPool::threadLoop() {
    while (m_isStarted) {
        // 从任务队列中取出线程并运行
        Task task = take();
        if (task) task();
    }
}

// 向任务队列中添加任务
void ThreadPool::addTask(const Task& task) {
    unique_lock<mutex> lock(m_mutex);
    m_tasks.push_back(task);
    m_cond.notify_all(); // 通知所有等待线程从任务队列中取任务
}

// 从任务队列中取任务
ThreadPool::Task ThreadPool::take() {
    unique_lock<std::mutex> lock(m_mutex);
    while (m_tasks.empty() && m_isStarted) {
        // 调用wait函数解锁
        // 被唤醒后加锁
        m_cond.wait(lock);
    }
    Task task;
    if (!m_tasks.empty() && m_isStarted)
    {
        task = m_tasks.back();
        m_tasks.pop_back();
    }
    return task;
}

 

参考链接 https://www.cnblogs.com/ailumiyana/p/10016965.html

 

posted @ 2021-08-29 23:16  封狼居胥!  阅读(70)  评论(0编辑  收藏  举报