C++ 线程池学习笔记(面试吹牛逼)

一、线程池的概念

        线程开的过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护这多个线程,等待着监督管理制者分配可并发执行任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池能保证内核的充分利用,还能防止过度调用。

       

二、线程池的组成

   1、线程池管理器

        创建一定数量的线程,启动线程,调配任务,管理着线程池
        本篇线程池目前只需要启动(start()),停止方法(stop()),及任务添加方法(addTask).
        start()创建一定数量的线程池,进行线程循环.
        stop()停止所有线程循环,回收所有资源.
        addTask()添加任务.

   2.工作线程

     线程池中线程,在线程池中等待并执行分配的任务.
     本篇选用条件变量实现等待与通知机制.

   3.任务接口

     添加任务的接口,以供工作线程调度任务的执行

   4.任务队列

    用于存放没有处理的任务。提供一种缓冲机制

三、实现线程池的具体步骤:

   1、设置一个生产者消费者队列,作为临界资源

   2.初始化n个线程,并让其运行起来,加锁去任务队列去任务运行

   3.当任务入队列为空的时候,所有线程阻塞

   4.当生产者队列来了一个任务后,先对队列加速,把任务挂载到队列上,然后使用条件变量去通知阻塞中一个线程处理任务,当任务处理完成之后,该线程会被重新放回线程池中,以供其他的任务调用。

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++线程池可以用来处理一些需要并发执行的任务,同时避免频繁创建和销毁线程所带来的开销。下面是一个简单的C++线程池实现: ```cpp #include <iostream> #include <queue> #include <thread> #include <mutex> #include <condition_variable> class ThreadPool { public: ThreadPool(size_t num_threads) { for (size_t i = 0; i < num_threads; ++i) { threads_.emplace_back([this] { while (true) { Task task; { std::unique_lock<std::mutex> lock(mutex_); cond_.wait(lock, [this] { return !tasks_.empty() || stop_; }); if (stop_ && tasks_.empty()) return; task = std::move(tasks_.front()); tasks_.pop(); } task(); } }); } } ~ThreadPool() { { std::unique_lock<std::mutex> lock(mutex_); stop_ = true; } cond_.notify_all(); for (auto& thread : threads_) { thread.join(); } } template <typename Func, typename... Args> void AddTask(Func&& func, Args&&... args) { auto task = std::bind(std::forward<Func>(func), std::forward<Args>(args)...); { std::unique_lock<std::mutex> lock(mutex_); tasks_.emplace(std::move(task)); } cond_.notify_one(); } private: using Task = std::function<void()>; std::vector<std::thread> threads_; std::queue<Task> tasks_; std::mutex mutex_; std::condition_variable cond_; bool stop_ = false; }; ``` 这个实现定义了一个ThreadPool类,构造函数中创建了指定数量的线程,并且每个线程都会从任务队列中获取任务并执行;析构函数中会通知所有线程停止执行,并等待所有线程退出;AddTask方法用于添加一个任务到任务队列中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值