Linux下线程池的代码

2023-11-15

此博客仅为了存放代码。(Linux,加锁,线程池)

头文件:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <sys/mman.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <ctype.h>
#include <string.h>

#define	_PORT		8000
#define	_BUF_SIZE	1500
#define	_LISTEN		128
#define	TRUE	1
#define	FALSE	0
#define	CREATE_DES	10


/*Task Queue*/
typedef struct
{
	void * (*task)(void*);
	void * arg;
}task_t;
/*Thread pool*/
typedef struct
{
	pthread_mutex_t pool_lock;
	pthread_mutex_t arg_lock;
	pthread_cond_t not_full;
	pthread_cond_t not_empty;
	pthread_t * threads; //(pthread_t *)malloc(max*(pthread_t))
	pthread_t Manager_tid;
	task_t * task_queue;
	int pool_min;
	int pool_max;
	int alive;
	int busy;
	int queue_front;
	int queue_rear;
	int queue_max;
	int queue_size;
	int pool_shutDown;
	int wait;
}pool_t;

/*Function*/
//1.创建线程池
pool_t * Pool_Create(int , int ,int);
//2.生产者工作
int Pool_Add_TaskQueue(pool_t *,void*(*)(void * ),void * );
//3.消费者
int Pool_Def_Task(pool_t * ,)
	/*
		上锁
		如果当前队列任务为0,并且线程池开关未关闭,消费者阻塞
		如果线程池开关为关闭,销毁线程池
		判断wait 回收数量如果大于0,结束自身线程,wait--;
		从头索引出队
		重新计算头索引 pool->queue_front = (pool->queue_front+1)%pool->queue_max;
		当前队列任务数减1 ,pool->queue_size--;
		唤醒一个生产者 pthread_cond_signal(&pool->not_full);
		执行用户工作
		解锁
		

	*/
//4.用户工作
//5.管理者工作
	/*
			周期性检测线程池情况,统计线程池数据
			试探存活线程数
			计算扩容与缩减
			
		
	*/

.c文件:

#include <thread_pool.h>
pool_t * Pool_Create(int thread_min , int thread_max , int queue_max)
{
		pool_t * pool = NULL;
		int i=0;
		if((pool = (pool_t * )malloc(sizeof(pool_t)))==NULL)
		{
				perror("Pool_Create() pool Malloc:");
				return NULL;
		}
		pool->pool_min = thread_min;
		pool->pool_max = thread_max;
		pool->alive = 0;
		pool->busy = 0;
		pool->queue_front = 0;
		pool->queue_rear = 0;
		pool->queue_max = queue_max;
		pool->queue_size = 0;
		pool->pool_shutDown = TRUE;
		if((pool->threads = (pthread_t *)malloc(thread_max * sizeof(pthread_t)))==NULL)
		{
				perror("Pool_Create() threads Malloc:");
				return NULL;
		}
		memset(pool->threads,0,thread_max * sizeof(pthread_t));
		if((pool->task_queue = (task_t *)malloc(queue_max * sizeof(task_t)))==NULL)
		{
				perror("Pool_Create() task_queue Malloc:");
				return NULL;
		}
		if(pthread_mutex_init(&pool->pool_lock,NULL)!=0||pthread_mutex_init(&pool->arg_lock,NULL)!=0||pthread_cond_init(&pool->not_full)!=0||pthread_cond_init(&pool->not_empty)!=0)
		{
				perror("Pool_Create() init Mutex or Cond:");
				return NULL;
		}
		for(i;i<CREATE_DES;i++){
				pthread_create(&pool->threads[i],NULL,(消费者工作),(传参));
		}
		pthread_create(&pool->Manager_tid,NULL,(管理者工作),(传参));
		return pool;
}
int Pool_Add_TaskQueue(pool_t * pool,void * (*Work)(void*arg),void*arg)
{
		//1.判断生产者是否需要阻塞
		pthread_mutex_lock(pool->pool_lock);
		while(pool->queue_size == pool->queue_max && pool->pool_shutDwon==TRUE){
				pthread_cond_wait(&pool->not_full,&pool->pool_lock);

		}
		if(pool->pool_shutDown == FALSE){
						pthread_mutex_unlock(&pool->pool_lock);
						/*退出处理*/
		}
		/*不一定行不行?*/
		if(pool->task_queue[pool->queue_rear].arg != NULL){
			free(pool->task_queue[pool->queue_rear].arg);
			pool->task_queue[pool->queue_rear] = NULL;
		}
		/*将任务添加到队列尾端*/
		pool->task_queue[pool->queue_rear].task = Work;
		pool->task_queue[pool->queue_rear].arg = arg;
		/*计算队列*/
		pool->queue_rear = (pool->queue_rear+1)%pool->queue_max;
		pool->queue_size++;
		/*唤醒一个消费者*/
		pthread_cond_signal(&pool->not_empty);
		/*解锁*/
		pthread_mutex_unlock(&pool->pool_lock);
		return 0;
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下线程池的代码 的相关文章

随机推荐

  • 【YOLO学习笔记——数据集】之一YOLO数据集制作1(含LabelImg工具讲解)

    前言 如果你有什么问题 希望跟我能够一起交流 除了通过博客交流外 欢迎你加入我的QQ群 一起交流有关于机器学习 深度学习 计算机视觉有关内容 目前我并未确定具体的研究方向 所以现在 处于广泛涉猎阶段 希望我们能够一起沟通 下图是我的群二维码
  • HTTPS】HTTPS过程详解,tcpdump抓包 全过程分析

    RFC中的HTTPS交互过程如下 抓包分析 Client Hello 客户端支持的TLS最高版本号 客户端生成的随机数 客户端支持的加密套件 主机名server name cipher suite怎么理解 名字为 ECDH ECDSA AE
  • Win 10 删除多余无效的打开方式

    一 问题描述 提示 使用右键 属性 打开方式 选错了应用程序 我这里选wps exe 选成了ksolaunch exe 然后就在右键中出现了一个无效的打开方式 很别扭 二 解决方案 在学习多篇文章关于如何删除多余打开方式的文章后发现 要删除
  • 【CV夏令营】笔记03:使用PaddlePaddle套件

    0 学习背景 有幸参与了DataWhale的AI视觉夏令营 沉浸式全流程体验AI比赛 比赛题目是 脑PET图像分析和疾病预测挑战赛 这里给出链接 https challenge xfyun cn topic info type pet 20
  • 2019 必知的 10 大顶级 python 库

    朋友们 我是床长 如需转载请标明出处 http blog csdn net jiangjunshow 作为数据科学和机器学习相关的研究和开发人员 大家每天都要用到 python 在本文中 我们将讨论一些 python 中的顶级库 开发人员可
  • 【前端

    图 先看一个例子 html div class container div class item 内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容 内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
  • 图片清晰度,分辨率,像素总结

    像素 像素是一个个小方块 是构成位图的基本单位 将图片放大即可看出来 如图 分辨率 显示分辨率是指像素的总数量 如上图的2200 1400 也就是宽有2200个像素 高有1400个像素 图像分辨率是指每英寸所包含的像素个数 如上图的72像素
  • 基础网络拓扑的配置

    要求 全网可达 拓扑结构 使用的设备 1台路由器 2台交换机 4台电脑 解决网络拓扑 1 确定广播域的个数 2 分配网段 3 配置IP地址 优先配置路由器 确定广播域的个数 路由器有两个接口有连线 分为两个不同的广播域 分配网段 我采用19
  • Invalid contextPath ‘/xxx‘: must match the start of requestPath: ‘//xxx/yyy‘

    记录一个升级spring boot 版本从2 1升级到2 6之后的错误 java lang IllegalArgumentException Invalid contextPath admin must match the start of
  • java jar killed_容器中Java 程序OOMKilled原因浅析

    背景 业务的容器化刚刚搞完 线上开始告警 容器重启 容器重启 describe pod 查看原因是OOMKilled 分析 OOMKilled 是pod 中的进程使用的内存超过了 spec containers resources limi
  • 指针(一)

    学习c语言 不学指针 等于没学 可见指针在c语言中有多重要 指针是C语言中的一个重要概念及其特点 也是掌握C语言比较困难的部分 指针定义 指针也就是内存地址 指针变量是用来存放内存地址的的变量 指针的作用是 通过指针不仅可以对数据本身 还可
  • OpenGL ES着色器语言(GLSL ES)规范 ——下篇

    文章目录 前言 分支和循环 if if else for continue break discard 着色器内置变量 函数 函数定义 规范声明 webgl内置函数 存储限定字 const attribute uniform varying
  • MYSQL 8数据库原理及应用(徐丽霞 微课版)——第一章知识要点

    目录 数据库的基本概念 数据库管理技术的发展阶段 数据库的体系结构 数据模型 关系运算 数据库的基本概念 信息与数据库 数据 Data 是描述事物的符号记录 是数据库中存储的基本对象 信息 信息的传递需要物质载体 且信息的获取和传递都要消耗
  • 业务高速增长场景下的稳定性建设实战

    背景 静儿在2017年8月25日怀着 再也不要下班时间收到报警 的美好期待加入美团金融智能支付负责核心交易 结果入职后收到的报警一天紧似一天 核心交易是整个智能支付的核心链路 承担着智能支付百分之百的流量 下面是我们的日单量增长曲线 从图中
  • postman界面变成了左右结构怎么办

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 在左上角 file settongs中设置一下
  • Linux下编辑文件并保存

    第一步 cd到该文件的目录下 第二步 vi 要编辑的文件名 进入普通模式 可以查看文件内容 第三步 输入 i 进入编辑模式 开始编辑文本 第四步 编辑之后 按ESC退出到普通模式 第五步 在普通模式下 输入 进入命令模式 第六步 在命令模式
  • ADCS攻击利用

    ADCS攻击利用 个人公众号创世信安 一 ADCS相关介绍 1 ADCS AD CS证书服务 SSL证书 可以部署企业根或者独立根建立SSL加密通道 和其他服务证书的区别在于加密强度 本次利用的漏洞产生的原因是ADCS支持的服务器角色功能错
  • spring-boot整合基本jdbc(基于oracle数据库)

    点击有惊喜 https mp weixin qq com s 2My JPTIaF02w70J CRM4A 快速搭建一个web工程 搭建完一个web工程 要想连接上oracle数据库 还得进行以下操作 1 在pom xml中引入jdbc连接
  • 奋斗的人生很精彩

    奋斗 是人生道路上永恒的主题 它意味着不懈的努力 不断的追求 以及对梦想的执着追求 在我们的人生旅途中 每个人都有自己的目标和梦想 有些人梦想成为一名成功的商人 有些人希望成为一名伟大的科学家 而有些人则渴望成为一名杰出的艺术家 无论我们的
  • Linux下线程池的代码

    此博客仅为了存放代码 Linux 加锁 线程池 头文件 include