咳咳。c++11 加入了线程库,从此告别了标准库不支持并发的历史。然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池、信号量等。线程池(thread pool)这个东西,在面试上多次被问到,一般的回答都是:“管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做,循环往复。” 貌似没有问题吧。但是写起程序来的时候就出问题了。
废话不多说,先上实现,然后再啰嗦。(dont talk, show me ur code !)
- #ifndef ILOVERS_THREAD_POOL_H
- #define ILOVERS_THREAD_POOL_H
- #include <iostream>
- #include <functional>
- #include <thread>
- #include <condition_variable>
- #include <future>
- #include <atomic>
- #include <vector>
- #include <queue>
- // 命名空间
- namespace ilovers {
- class TaskExecutor;
- }
- class ilovers::TaskExecutor{
- using Task = std::function<void()>;
- private:
- // 线程池
- std::vector<std::thread> pool;
- // 任务队列
- std::queue<Task> tasks;
- // 同步
- std::mutex m_task;
- std::condition_variable cv_task;
- // 是否关闭提交
- std::atomic<bool> stop;
- public:
- // 构造
- TaskExecutor(size_t size = 4): stop { false}{
- size = size < 1 ? 1 : size;
- for(size_t i = 0