涉及知识点mutexlocklamda表达式队列queueemplace可变参数模板函数万能引用左值引用右值引用完美转发forward函数适配器bind时间库chrono代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778#include<iostream>#include<thread>#include<mutex>#include<condition_variable>#include<string>#include<queue>#include<vector>#include<functional>using namespace std;class ThreadPool {public: ThreadPool(int numThreads): stop(false) { for (int i = 0; i < numThreads; i++) { threads.emplace_back([this] { while (1) { function<void()> task; { unique_lock<mutex> lock(mtx); condition.wait(lock, [this] { return !tasks.empty() || stop; }); if (stop && tasks.empty()) { return; } task = move(tasks.front()); tasks.pop(); } task(); } }); } } ~ThreadPool() { { unique_lock<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) { function<void()>task = bind(forward<F>(f), forward<Args>(args)...); { unique_lock<mutex> lock(mtx); tasks.emplace(move(task)); } condition.notify_one(); }private: vector<thread> threads; queue<function<void()> > tasks; mutex mtx; condition_variable condition; bool stop;};int main(){ ThreadPool pool(4); for (int i = 0; i < 12; i++) { pool.enqueue([i] { cout << "task : " << i << "is running !"<<endl; this_thread::sleep_for(chrono::seconds(2)); cout << "task : " << i << "is close !" << endl; }); } return 0;}