#include <iostream>
#include <thread>
#include <mutex>
#include <string>
#include <condition_variable>
#include <queue>
#include <vector>
#include <functional>
// 1:访问全局变量必须加锁
// 2:
class ThreadPool {
public:
ThreadPool(int thread_number)
:is_exit_(false)
{
for (int i = 0; i < thread_number; i++)
{
thread_pools_.emplace_back([this]() {
while (true){
std::unique_lock<std::mutex> lock(mtx_);
condition_variable_.wait(lock, [this]() {
return !all_tasks_.empty() || is_exit_; //!< 当有任务时,返回true不等待 ,退出 true 直接不等待
});
if (is_exit_ && all_tasks_.empty()) {
return;
}
auto task = all_tasks_.front();
all_tasks_.pop();
lock.unlock();
task();
}
});
}
}
// 尽量使用C++新特性
template<class Func,class ...Args> //!< F是函数指针, Args是参数
void AddTask(Func&& func, Args&&... args) {
std::function<void()> task = std::bind(std::forward<Func>(func), std::forward<Args>(args)...);
{
std::unique_lock<std::mutex> lock(mtx_);
all_tasks_.emplace(move(task));
}
condition_variable_.notify_one(); //!< 任务队列对应线程池。
}
~ThreadPool() {
{
std::unique_lock<std::mutex> lock(mtx_);
is_exit_ = true;
}
condition_variable_.notify_all(); //!< 线程结束通知所有线程
for (int i = 0; i < thread_pools_.size(); i++)
{
thread_pools_[i].join(); //!< main函数join
}
}
private:
bool is_exit_;
std::mutex mtx_;
std::condition_variable condition_variable_;
std::vector<std::thread> thread_pools_;
std::queue<std::function<void()>> all_tasks_;
};
int main() {
ThreadPool thread_pool(5);
for (int i = 0; i < 10; i++)
{
thread_pool.AddTask([i]() {
std::cout << i << " begin" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << i << " end" << std::endl;
});
}
getchar();
return 0;
}
06-01