什么是线程池?
线程池是一种线程使用模式.线程过多或者频繁的创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能.而线程池维护着多个线程,等待着管理器分配可并发执行的任务,这避免了在处理短时间任务时创建与销毁线程的代价,以及保证了线程的可复用性.线程迟不仅能保证内核的充分利用,还能防止过分调度.
线程池原理
预先创建预定数量的线程,将多个任务加入到任务队列,类似于生产者消费者,多个线程相当于消费者,一个任务队列充当生产者.当任务队列被塞入任务时,线程们就去竞争这些任务,但当每次只有一个线程能够得到任务,该任务执行完成后,线程可以释放出来去承接下一个任务,这样可以保证多个任务并发地执行.
#include <thread>
#include <mutex>
#include <atomic>
#include <condition_variable>
#include <functional>
#include <vector>
#include <queue>
#include <iostream>
class ThreadPool
{
public:
using Task = std::function<void()>;
explicit ThreadPool(int num) : _thread_num(num),_is_running(false) {}
~ThreadPool() {
if(_is_running)
stop();
}
void start() {
_is_running = true;
//开启线程
for(int i = 0; i < _thread_num; ++i)
_threads.emplace_back(std::thread(&ThreadPool::work,