简易线程池实现(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