C++线程池思想

1 线程池基本概念和原理

1.1 概念

C++线程池是一种并发的技术,它能有效的管理并发线程、减少资源占用和提高程序的性能。本文基于linux的 线程库,使用C++对线程池进行封装,并对底层实现方式进行描述。

 1.2 线程池作用

线程池通过预先创建一组线程并复用它们,线程池有效地降低了线程创建和销毁的时间和资源消耗。同时,通过管理线程并发数量,线程池有助于减少线程之间的竞争,增加资源利用率,并提高程序运行的性能。

  • 减少线程创建和销毁的开销
    • 每次需要执行一个任务时,创建和销毁线程会消耗大量的系统资源和时间。线程池通过维护一组可以重用的线程,避免了频繁的线程创建和销毁开销
  • 线程竞争造成的性能瓶颈
    • 通过限制线程池中最大线程的数量,避免了系统因过多线程而导致的资源耗尽(如 CPU、内存)问题,保障系统的稳定性和响应性。
  • 提高并发处理能力
    • 线程池可以同时处理多个任务,便于充分利用多核 CPU 的性能。通过调度线程执行,线程池能够提高应用程序的吞吐量。
  • 任务规划和调度
    • 线程池可以根据系统负载动态调整活动线程的数量。根据当前的任务量和执行情况,增加或减少工作线程,以优化资源使用。

2 基于C++的线程池实现方式

2.1 任务队列的实现 

在实现线程池之前,我们需要先创建一个任务队列的类。因为线程池的类里面需要维护一个任务队列,可以将线程中需要做的任务添加到任务队列中

  • 任务队列类的实现 
#pragma once
#include 
#include 
#include 
#include 
// 任务结构体
struct Task
{
	Task()
	{
		function = nullptr;
		arg = nullptr;
	}
	void *(*function)(void *);          /* 函数指针,回调函数 */
	void *arg;                          /* 上面函数的参数 */
};

typedef void* (*callback)(void*);
// 任务队列类
class TaskQueue
{
public:
	TaskQueue();
	~TaskQueue();
	// 往任务队列中添加任务
	void addTask(Task &task);
	void addTask(callback func, void* arg);

	// 获取当前队列中的任务数量
	inline size_t taskNumber()
	{
		return m_queue.size();
	}

	// 从队列中取出一个任务
	Task takeTask();

private:
	pthread_mutex_t m_mutex;	// 互斥锁
	std::queue m_queue;
};

  • Task结构体
    •  void *(*function)(void *);       函数指针,用于指向回调函数
    • void *arg;  上面的回调函数的参数
  • TaskQueue类
    • 构造函数就只是初始化了互斥锁 m_mutex;
    • addTask函数重载,其实就是将传入的Task类的参数push进入m_queue中
      • 重载版本1 Task类型参数,直接push
      • 重载版本2 两个参数,先创建Task对象然后初始化后push
    • taskNumber函数,返回m_queue中任务的数量
    • takeTask函数,从队列中取出一个任务,实现方式
      • 取出队列的头元素
      • 将队列的头元素弹出

你可能感兴趣的:(基础组件,c++,开发语言,linux)