c++11线程池实现

咳咳。c++11 加入了线程库,从此告别了标准库不支持并发的历史。然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池、信号量等。线程池(thread pool)这个东西,在面试上多次被问到,一般的回答都是:“管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做,循环往复。” 貌似没有问题吧。但是写起程序来的时候就出问题了。

废话不多说,先上实现,然后再啰嗦。(dont talk, show me ur code !)


 
 
 
  1. #ifndef ILOVERS_THREAD_POOL_H
  2. #define ILOVERS_THREAD_POOL_H
  3.  
  4. #include <iostream>
  5. #include <functional>
  6. #include <thread>
  7. #include <condition_variable>
  8. #include <future>
  9. #include <atomic>
  10. #include <vector>
  11. #include <queue>
  12.  
  13. // 命名空间
  14. namespace ilovers {
  15. class TaskExecutor;
  16. }
  17.  
  18. class ilovers::TaskExecutor{
  19. using Task = std::function<void()>;
  20. private:
  21. // 线程池
  22. std::vector<std::thread> pool;
  23. // 任务队列
  24. std::queue<Task> tasks;
  25. // 同步
  26. std::mutex m_task;
  27. std::condition_variable cv_task;
  28. // 是否关闭提交
  29. std::atomic<bool> stop;
  30. public:
  31. // 构造
  32. TaskExecutor(size_t size = 4): stop { false}{
  33. size = size < 1 ? 1 : size;
  34. for(size_t i = 0
  • 71
    点赞
  • 441
    收藏
    觉得还不错? 一键收藏
  • 30
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值