Linux 线程池源码剖析

1 了解线程池

1-1线程池的概述

由一个任务队列和一组处理队列的线程组成。一旦工作进程需要处理某个可能“阻塞”的操作,不用自己操作,将其作为一个任务放到线程池的队列,接着会被某个空闲线程提取处理。

在这里插入图片描述

1-2线程池的组件

任务 		 待处理的工作,通常由标识、上下文和处理函数组成。
任务队列 	 按顺序保存待处理的任务序列,等待线程中的线程组处理。
线程池 		 由多个已启动的一组线程组成。
条件变量 	 一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足。
互斥锁 		 保证在任一时刻,只能有一个线程访问该对象。

2 互斥锁 与 条件变量 自定义封装 声明 与 定义

thread.h

#ifndef _DEMO_THREAD_H_INCLUDED_
#define _DEMO_THREAD_H_INCLUDED_

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>

typedef intptr_t        int_t;
typedef uintptr_t       uint_t;

#define  OK          0
#define  ERROR      -1

//---------互斥量(互斥锁)接口的封装-----------定义:thread_mutex.c
int thread_mutex_create(pthread_mutex_t *mtx);				//线程 互斥锁的 创建
int thread_mutex_destroy(pthread_mutex_t *mtx);				//线程 互斥锁的 销毁
int thread_mutex_lock(pthread_mutex_t *mtx);				//线程 互斥锁的 加锁
int thread_mutex_unlock(pthread_mutex_t *mtx);				//线程 互斥锁的 解锁



//---------条件变量接口的封装-----------------定义:thread_cond.c
int thread_cond_create(pthread_cond_t *cond);				//线程 条件变量的 创建
int thread_cond_destroy(pthread_cond_t *cond);				//线程 条件变量的 销毁
int thread_cond_signal(pthread_cond_t *cond);				//线程 条件变量的 信号发送
int thread_cond_wait(pthread_cond_t *cond,					//线程 条件变量的 信号接受
					 pthread_mutex_t *mtx);	

#endif /* _DEMO_THREAD_H_INCLUDED_ */

thread_mutex.c

#include "thread.h"

//互斥锁的创建
int thread_mutex_create(pthread_mutex_t *mtx)
{
   
    int                   err;
    pthread_mutexattr_t  attr; 					 //互斥锁属性变量
   //1对互斥变量属性 pthread_mutexattr_t 初始化
    err = pthread_mutexattr_init(&attr);
    if (err != 0) {
   
        fprintf(stderr, "pthread_mutexattr_init() failed, reason: %s\n",strerror(errno));
        return ERROR;
    }

   //2设置互斥变量防 死锁检测 PTHREAD_MUTEX_ERRORCHECK 不允许同一个线程多次获取同一个锁导致的死锁
    err = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
    if (err != 0) {
   
	fprintf(stderr, "pthread_mutexattr_settype(PTHREAD_MUTEX_ERRORCHECK) failed, reason: %s\n",strerror(errno));
        return ERROR;
    }

    //3对创建的互斥锁 mtx 设置 attr 属性
    err = pthread_mutex_init(mtx, &attr);
    if (err != 0) {
   
        fprintf(stderr,"pthread_mutex_init() failed, reason: %s\n",strerror(errno));
        return ERROR;
    }
    //3销毁互斥锁属性变量
    err = pthread_mutexattr_destroy(&attr);
    if (err != 0) {
   
	fprintf(stderr,"pthread_mutexattr_destroy() failed, reason: %s\n",strerror(errno));
    }

    return OK;
}

//互斥锁的销毁
int thread_mutex_destroy(pthread_mutex_t *mtx)
{
   
    int  err;

    err = pthread_mutex_destroy(mtx);
    if (err != 0) {
   
        fprintf(stderr,"pthread_mutex_destroy() failed, reason: %s\n",strerror(errno));
        return ERROR;
    }
    return OK;
}


//互斥锁上锁
int thread_mutex_lock(pthread_mutex_t *mtx)
{
   
    int  err;

    err = pthread_mutex_lock(mtx);
    if (err == 0) {
   
        return OK;
    }
	fprintf(stderr,"pthread_mutex_lock() failed, reason: %s\n",strerror(errno));

    return ERROR;
}

//互斥锁解锁
int thread_mutex_unlock(pthread_mutex_t *mtx)
{
   
    int  err;

    err = pthread_mutex_unlock(mtx);

#if 0
    ngx_time_update();
#endif

    if (err == 0) {
   
        return OK;
    }
	
	fprintf(stderr,"pthread_mutex_unlock() failed, reason: %s\n",strerror(errno));
    return ERROR;
}

thread_cond.c

#include "thread.h"

int thread_cond_create(pthread_cond_t *cond)
{
   
    int

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/244081.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

xilinx 产品系列分类

1. 按照产品代数&#xff0c;分为6代&#xff0c;7代&#xff0c;ultrascale&#xff0c;ultrascale&#xff0c;Versal。6代是较早的器件&#xff0c;现在基本是7代及之后的产品&#xff0c;最新的一代是Versal&#xff0c;网上很多说法提到7系列也即是7代&#xff0c;在第二章…

以柔克刚:软体机器人的柔性革命与无限可能

原创 | 文 BFT机器人 戳“精彩内容”不容错过 你知道什么是软体机器人吗&#xff1f;真的是表面所理解的那样&#xff0c;这个“机器人是软的&#xff1f;”。当然不是啦&#xff01;那下面小编将带你具体解读一下软体机器人的来源与发展。 软体机器人是一类由软体驱动材料构成…

seata的安装及基本使用

seata的安装及基本使用 安装注意事项1. 启动时需要带上seata所在服务器的地址和端口&#xff08;默认是8091&#xff09;2. seata的服务端配置文件application.yml中在配置nacos的namespace时&#xff0c;需要注意的是&#xff1a;对应的值是nacos中namespace的id, 而不是名称&…

3分钟打造私人微信ChatGPT助手:新手友好指南!

接上文&#xff1a; https://mp.weixin.qq.com/s/RCqX0rx7TEu1gIwHEBBWKQ 本文适用于小白用户&#xff0c;技术大佬勿入&#xff01; 前言 这里教大家如何快速的拥有一个属于自己的微信GPT助手 我个人其实不是这么部署的&#xff0c;但是为了方便小白用户&#xff0c;探索了一个…

【AI底层逻辑】——“数学华尔兹”之一元线性回归

一元线性回归模型想必大家都耳熟能详&#xff0c;这里不再赘述。但在使用python中机器学习包时一定见过类似模型评价参数的输出&#xff0c;这一章我们就讲一讲回归分析里一些模型评价概念&#xff01; 一、方差分析ANOVA 方差分析是一种用于确定线性回归模型中不同变量对目标…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 项目背景 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的提…

数字孪生轻量化引擎——AMRT3D引擎

随着全球经济亟待复苏&#xff0c;作为科技发展主要需求技术之一&#xff0c;数字孪生已经成为全球多个国家重点布局行业。例如&#xff0c;美国工业互联网盟将数字孪生作为工业互联网落地的核心和关键&#xff0c;德国工业4.0参考架构将数字孪生作为重要内容。 数字孪生已经形…

【问题解决】将页面下载为PDF文件(前端实现)

在前端开发过程中&#xff0c;将html页面下载为pdf文件的思路&#xff1a;使用html2canvas和jsPDF两个库&#xff0c;大致流程就是首先使用html2canvas库将组件内容转换为图像&#xff0c;然后使用jsPDF库将图像生成为PDF文件。 安装html2canvas库 npm install html2canvas安…

联邦学习算法介绍-FedAvg详细案例-Python代码获取

联邦学习算法介绍-FedAvg详细案例-Python代码获取 一、联邦学习系统框架二、联邦平均算法&#xff08;FedAvg&#xff09;三、联邦随梯度下降算法 (FedSGD&#xff09;四、差分隐私随联邦梯度下降算法 (DP-FedSGD&#xff09;五、差分隐私联邦平均算法 (DP-FedAVG&#xff09;六…

word图片点击放大,word图片双击放大

网上自己搜了半天&#xff0c;都是顾左右而言他&#xff0c;直接实践一下。 干货就是&#xff1a;调整word视图为阅读模式&#xff0c;双机图片 就能放大查看&#xff0c;然后还会有一个 放大镜供点击放大到整个屏幕。 其实挺好理解的&#xff0c;word跟wps不同&#xff0c;w…

二十六、模型、视图、代理

二十六、模型、视图、代理 模型&#xff08;Model&#xff09; InterView框架中所有模型都基于抽象基类QAbstractItemModel类&#xff0c;此类由QAbstractListModel、QAbstractTableModel和QAbstractProxyModel类继承。 视图&#xff08;View&#xff09; InterView框架中的…

为什么需要分库分表,如何实现?

本文我们主要讲解“为什么需要分库分表&#xff0c;如何实现”。 在前文中讲到了读写分离&#xff0c;读写分离优化了互联网读多写少场景下的性能问题&#xff0c;考虑一个业务场景&#xff0c;如果读库的数据规模非常大&#xff0c;除了增加多个从库之外&#xff0c;还有其他…

爬虫 scrapy ——scrapy shell调试及下载当当网数据(十一)

目录 一、scrapy shell 1.什么是scrapy shell&#xff1f; 2.安装 ipython 3.使用scrapy shell 二、当当网案例 1.在items.py中定义数据结构 2.在dang.py中解析数据 3.使用pipeline保存 4.多条管道的使用 5.多页下载 参考 一、scrapy shell 1.什么是scrapy shell&am…

行业锦囊|住建厅CA证书使用指南

数字化、高效率、低成本已成为企业发展转型的重要考量因素&#xff0c;建筑工程企业也不例外。而工程资料签署和管理又是每个建筑工程企业发展转型绕不开的课题&#xff1a;在建工程项目异地盖章周期性长、庞大的签署量及海量的文件管理如何优化&#xff1b;企业如何缩短对公业…

AXURE地图获取方法

AXURE地图截取地址 https://axhub.im/maps/ 1、点击上方地图或筛选所需地区的地图&#xff0c;点击复制到 Axure 按钮&#xff0c;到 Axure 粘贴就可以了 2、复制到 Axure 后&#xff0c;转化为 svg 图形&#xff0c;就可以随意更改尺寸/颜色/边框&#xff0c;具体操作如下&am…

【AI美图】第01期效果图,AI人工智能无绘画,美图欣赏

人工智能被各大平台传递&#xff0c;我也来凑一下热闹&#xff0c;放一组基础图片展示 介绍一下模型来源Stability AI&#xff1a; Stability AI直接将模型开源&#xff0c;且方式之粗暴&#xff0c;几乎完全不对生成内容做任何审核或者过滤。目前发布的稳定版本仅包含部分关…

ProcessOn基本介绍和完成案列和自定义元件

ProcessOn基本介绍和完成案列和自定义元件 1.什么是ProcessOn2.初步使用ProcessOn3.使用ProcessOn完成医疗项目门诊模块的流程图4.使用ProcessOn完成医疗项住院模块的流程图5.使用ProcessOn完成医疗项目药房模块的流程图5.使用ProcessOn完成会议oa模块的流程图6.自定义原件库1.…

设计表单表格组件

前言 什么是表单表格呢&#xff1f;简单来说就是在一个表格里面进行表单操作&#xff0c;执行增删改查。这在一些后台管理系统中是尤为常见的。 今天我们根据vue2 element-ui来设计一个表单表格组件。&#xff08;不涉及完整代码&#xff0c;想要使用完整功能可以看底部连接…

超级计算机行业分析:中国市场概念及发展现状研究

近年来&#xff0c;在技术研发和产业应用的共同推动下&#xff0c;中国超级计算机(简称“超算”)快速发展——技术创新方面&#xff0c;采用自主研发芯片的多个国内超算曾在世界超算榜单上排名第一;整体规模方面&#xff0c;在最新发布的全球超算榜单中&#xff0c;中国占比超过…

<博图> 浮点数(real)相加时结果不精确的解决方法

问题截图&#xff1a; 每按下一次按钮&#xff0c;浮点数1 加0.1&#xff0c;结果放在浮点数1中&#xff1b;在加到第8次时会多出小数点位数。 解决方法&#xff1a; 对要进行相加的浮点数进行转换&#xff0c;如下 &#xff1a; &#xff08;注&#xff1a;如果图片模糊保存…