#include<iostream>
#include<thread>
#include<vector>
#include<queue>
#include<functional>
#include<mutex>
#include<condition_variable>
#include<string>
class ThreadPool{
public:
ThreadPool(int numThread):stop(false){
for(int i=0;i<numThread;i++){
threads.emplace_back([this]{
while(1){
std::unique_lock<std::mutex>lock(mtx);
if(stop&&tasks.empty()) return ;
condition.wait(lock,[this]{return !tasks.empty()||stop;});
std::function<void()>task(std::move(tasks.front()));
tasks.pop();
lock.unlock();
task();
}
});
}
}
~ThreadPool(){
{
std::unique_lock<std::mutex>lock(mtx);
stop=true;
}
condition.notify_all();
for(auto& t:threads){
t.join();
}
}
template<class F,class... Args>
void enqueue(F&&f,Args&&... args){
std::function<void()>task=std::bind(std::forward<F>(f),std::forward<Args>(args)...);
std::unique_lock<std::mutex>lock(mtx);
tasks.emplace(move(task));
condition.notify_one();
}
private:
std::vector<std::thread>threads;
std::queue<std::function<void()>>tasks;
std::condition_variable condition;
std::mutex mtx;
bool stop;
};
int main(){
ThreadPool pool(1);
for(int i=0;i<10;i++){
pool.enqueue([i]{
std::cout<<"task: "<<i<<std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout<<"task :"<<i<<" is done!"<<std::endl;
});
}
return 0;
}