写过CURD的程序员肯定都熟悉“数据库连接池”这个东西,数据库连接是个昂贵的东西,因为它的创建过程比较耗费资源。所以为了节约资源、提高数据库操作的性能,“数据库连接池”就应运而生了。
其实线程池跟数据库连接池类似,一个线程的创建和销毁也需要耗费资源,如果反复地创建和删除线程,那么资源的浪费也是很可观的。所以,预先创建一些线程,在有任务的时候分配给相应的线程去执行,对提高系统的性能有非常积极的作用。
一、线程池的创建过程
1、创建线程
for (size_t i = 0; i < threadCount; ++i) {
threads.emplace_back(threadFunc, this);
}
threads是个vector,我们可以先创建一些线程,并把这些线程放到一个vector中。
2、任务队列与调度
void ThreadPool::addTask(const Task& task) {
{
lock_guard<mutex> lock(queueMutex);
taskQueue.emplace(task);
}
condition.notify_one();
}
新进来的任务会被加到taskQueue队列中,你可以根据一定的策略从taskQueue中取出任务,交给某个空闲的线程去执行。
3、线程执行及回收
void ThreadPool::threadFunc() {
while (true) {
Task task;
{
unique_lock<mutex> lock(queueMutex);
//wait()用来等一个东西
//1. 如果第2个参数为fals

文章介绍了线程池的概念,作为资源管理的一种手段,它能提高系统性能,避免频繁创建和销毁线程带来的开销。线程池的创建包括预先创建线程、任务队列调度、线程执行和回收,以及如何优雅地终止线程池。文中还提供了一个简单的线程池实现示例。
最低0.47元/天 解锁文章
586

被折叠的 条评论
为什么被折叠?



