1--线程池的实现
基本的线程池包括线程数组和任务队列,任务队列存储待执行的任务,线程数组存储多个线程,线程每次从任务队列中取任务来执行;
#include <iostream>
#include <mutex>
#include <thread>
#include <string>
#include <condition_variable>
#include <queue>
#include <functional>
class ThreadPool{
public:
ThreadPool(int numThreads) :stop(false){ // 开辟numThreads个线程
for(int i = 0; i < numThreads; i++){
threads.emplace_back([this]{
while(true){
std::unique_lock<std::mutex> lock(mtx);
condition.wait(lock, [this]{ // 等待被通知任务队列不为空
return !tasks.empty() || stop;
});
if(stop) return;
// 取任务并执行
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(std::move(task));
}
condition.notify_one();
}
private:
std::vector<std::thread> threads; // 线程数组
std::queue<std::function<void()>> tasks; // 任务队列
std::mutex mtx;
std::condition_variable condition;
bool stop;
};
int main(int argc, char *argv[]){
ThreadPool Tpool(4);
for(int i = 0; i < 10; i++){
Tpool.enqueue([i]{
std::cout << "task: " << i << " is running" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "task: " << i << " is done" << std::endl;
});
}
return 0;
}