线程池(Thread Pool)cpp

一、什么是线程池?

线程池(Thread Pool) 是一种预先创建并维护若干线程的并发编程模型,所有任务提交后由池内线程处理,避免频繁创建销毁线程带来的系统开销。

线程池核心理念:

  • 资源复用:复用固定数量的线程处理大量短时任务

  • 控制并发:防止线程数无控制增长导致内存耗尽或CPU调度崩溃

  • 任务排队:合理调度和管理任务执行顺序

二、线程池原理架构

线程池包含三大核心模块:

  1. 任务队列(Task Queue):存储待处理的任务

  2. 固定数量的工作线程(Worker Threads):循环从队列中取任务执行

  3. 线程管理器(ThreadPool):负责启动、停止线程和任务调度

运行流程:

+-----------------+           +---------------------+             +--------------------+
|  外部提交任务   | ---> |   线程池任务队列     | ---> |  工作线程执行任务    |
+-----------------+           +---------------------+             +--------------------+

三、线程池的优势

优势 说明
降低开销 线程复用,避免频繁创建和销毁系统线程,减少CPU和内存开销
控制并发 限制最大线程数量,避免线程数无限增长导致系统资源耗尽(OOM)
提升响应速度 空闲线程可立即响应新任务,避免线程创建延迟
支持任务排队 任务可进入队列,按顺序或策略处理
易于扩展和管理 可增加任务拒绝策略、定时任务、优先级队列等机制

 

 

 

 

 

 

 

 

 

四、线程池的适用场景 

  • 高并发网络服务器(Web Server / RPC Server)

  • 大量短任务的异步并发处理

  • IO密集型或计算密集型任务分离调度

  • 限制资源场景下的并发控制(如嵌入式)

五、C++ 线程池优化示例代码(完整可运行)

#include
#include
#include
#include
#include
#include
#include
#include

class ThreadPool {
public:
	explicit ThreadPool(size_t num_threads) :stop(false) {
		//创建固定数量的工作线程
		for (size_t i = 0; i < num_threads; ++i) {
			workers.emplace_back([this]() {
				while (true) {
					std::functiontask;
					{  //加锁取任务
						std::unique_locklock(this->queue_mutex);
						this->condition.wait(lock, [this]() {
							return this->stop || !this->tasks.empty();
							});
						if (this->stop && this->tasks.empty()) {
							return;
						}
						task = std::move(this->tasks.front());
						this->tasks.pop();
					}
					task();  //执行任务
				}
			});
		}
	}

	// 提交任务
	template
	void enqueue(F&& f, Args&&... args) {
		auto task = std::bind(std::forward(f), std::forward(args)...);
		{   // 线程安全加入任务队列
			std::unique_lock lock(queue_mutex);
			if (stop)
				throw std::runtime_error("enqueue on stopped ThreadPool");
			tasks.emplace(task);
		}
		condition.notify_one(); //唤醒一个线程
	}

	//线程池摧毁,等待线程退出
	~ThreadPool() {
		{
			std::unique_locklock(queue_mutex);
			stop = false;
		}
		condition.notify_all();
		for (std::thread& worker : workers) {
			if (worker.joinable()) {
				worker.join();
			}
		}
	}

private:
	std::vectorworkers;  //工作线程集合
	std::queue>tasks;  //任务队列
	std::mutex queue_mutex;  //队列互斥锁
	std::condition_variable condition;  //条件变量控制线程唤醒
	std::atomicstop;  //停止标志
};

//示例任务
void example_task(int n) {
	std::cout << "Task " << n << " is running in thread" << std::this_thread::get_id() << std::endl;
}

int main() {
	ThreadPool pool(4);  //创建包含4个线程的线程池

	//提交10个任务
	for (int i = 0; i < 10; i++) {
		pool.enqueue(example_task, i);
	}

	std::this_thread::sleep_for(std::chrono::seconds(2));  //模拟主线程进行其他操作

	std::cout << "Main thread exits." << std::endl;

	return 0;
}

六、线程池优化亮点(C++版设计要点)

  • 固定线程数设计:避免线程无上限增长,防止 OOM

  • 任务队列(Blocking Queue):提交任务后,线程自动取出执行

  • 智能调度(Condition Variable):避免忙等,提升性能

  • 线程安全:锁+条件变量保证多线程下安全

  • RAII 自动回收:析构自动等待所有线程退出,防止资源泄漏

线程池作为现代并发编程中的核心模型,具备以下优势:

  • 极大提升多任务处理的性能

  • 避免线程爆炸和内存泄漏风险

  • 适用于各种高并发、异步、资源受限场景

C++ 中手写线程池有一定复杂度,但上面这份示例代码提供了完整的设计框架和工程可用性。后续可基于该框架扩展:

  • 定时任务

  • 动态扩缩容

  • 任务优先级队列

你可能感兴趣的:(线程池,c++,c++)