Linux:线程池 / 及如何创建一个线程池

线程池是一种资源管理方式,用于处理大量并发请求,避免频繁创建和销毁线程带来的开销。本文介绍了线程池的概念、应用场景及其优点,并探讨了如何在Linux环境下自主创建线程池,包括线程池的组成和任务处理机制。通过示例代码展示了如何实现一个具有灵活任务处理能力的线程池。
摘要由CSDN通过智能技术生成

线程池

线程池:通俗一点来说,就是一个有着很多线程的池子,线程数量由线程池的最大线程容量控制。当有需要处理的任务到来时,从线程池中取出一个线程去处理这个任务。

应用场景:有大量的数据处理请求,需要执行流并行或并发处理

若是每次有一个数据请求的到来需要去创建线程去处理,处理完销毁则会产生风险以及一些不必要的消耗

  1. 线程如若不限制线程创建的数量,在峰值压力下,线程创建过多,资源耗尽,有程序崩溃的风险。
  2. 创建一个线程的时间:线程创建+任务处理+线程销毁,如果任务处理的时间占比不高,则说明大量的资源都用于了线程的创建和销毁上,因此线程池用创建好的线程循环处理任务,避免了大量的线程创建和线程销毁的时间成本。

自主创建一个线程池

线程池组成:大量线程(每个线程循环的进行任务处理)+ 任务缓冲处理
在这里插入图片描述
线程池中的线程每次从任务队列的队首获取一个任务进行处理,线程间以此循环往复。

几个问题:

  1. 线程的入口函数都是在线程创建初传入线程的,会导致线程池中的线程进行任务处理的方式单一
  2. 线程的入口函数都一样,处理流程也就一样,只有单一的处理方式,灵活性太差

解决办法:
若任务队列中的任务,不仅仅是单纯的传入数据,并且包含了任务处理方式(入口函数),这时线程池中的线程只需要根据任务的数据和处理函数对数据进行处理,而不用关心是什么数据该如何处理。

代码

#include<cstdio>
#include<iostream>
#include<pthread.h>
#include<stdlib.h>
#include<queue>
using namespace std;


typedef void(*handler_t)(int data);  //定义一个任务处理函数指针
class Task{
   
	
public:
	//进行数据的传入,处理函数的传入
	void settask(int data,handler_t handler)
	{
   
		_data=data;
		_handler=handler;
	}
	//进行任务处理
	void Run()
	{
   
		_handler(_data);	
	}
	
private:
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值