c++实现简单的线程池,是一种常用的并发编程技术,用于提高程序的并行度和执行效率。下面我将为您提供实现线程池的完整攻略。
什么是线程池?
线程池是一种池化技术,用于管理和复用线程资源,避免频繁的线程创建和销毁。线程池中会预先创建一定数量的线程,并维护一个任务队列,当需要执行任务时,从队列中获取一个任务分配给线程执行。任务执行完毕后,线程回收到线程池中。
实现线程池的关键步骤:
-
创建任务队列:使用STL中的queue来实现队列,存储任务指针。
-
创建线程池:创建一定数量的线程,并启动线程的执行线程函数。
-
线程函数从任务队列中获取任务,并执行任务。
-
提供任务添加的接口:将需要线程池执行的任务添加到任务队列中。
-
线程执行的死循环要正确实现,以避免CPU过度占用的问题。
-
实现线程池析构函数,用于清除线程池中的线程。
示例说明:
示例一:
ThreadPool pool(4);
for(int i = 0; i < 10; i++){
pool.pushTask(new Task(i));
}
上述示例创建一个线程池,包含4个线程。循环10次,每次向线程池中添加一个任务。Task是用户自定义的任务类,实现了一个成员函数来执行具体的任务。
示例二:
ThreadPool pool(2);
std::vector<std::future<int>>results;
for(int i = 0; i < 8; i++){
results.emplace_back(
pool.pushTask([&](){
std::cout<<"Task "<<i<<" started"<<std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout<<"Task "<<i<<" finished"<<std::endl;
return i*i;
}));
}
for(auto &&r : results){
std::cout<<r.get()<<" ";
}
上述示例通过使用std::future将异步任务的结果传递给主线程。每个任务会休眠2秒,并返回它的平方值。循环8次,每次向线程池中添加一个任务,并将返回值存储在results数组中。最后,结果会输出到控制台上。
以上就是实现线程池的完整攻略和两个示例的说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++实现简单的线程池 - Python技术站