Linux 线程池源码剖析

news2024/9/27 17:32:45

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

D92-02-ASEMI快恢复二极管20A 200V

编辑&#xff1a;ll D92-02-ASEMI快恢复二极管20A 200V 型号&#xff1a;D92-02 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 特性&#xff1a;插件、快恢复二极管 最大平均正向电流&#xff1a;20A 最大重复峰值反向电压&#xff1a;200V 恢复时间&#xff1a;35ns…

QQ音乐评论爬虫程序【原创】

先找到一首歌&#xff0c;把请求参数替换到下面程序中 例如&#xff1a; ‘g_tk_new_20200303’: ‘5381’, ‘g_tk’:‘5381’, ‘topid’:‘102636799’, //歌曲ID ‘cv’:‘4747474’ … #此处修改请求的页数 if page >10: break import requests from urllib import p…

多组别cellchat

不同分组之间的配对分析 ⚠️&#xff1a;配对分析必须保证细胞类型是一样的&#xff0c;才可以进行配对。如果 两个样本的细胞类型不一样又想进行配对分析时&#xff0c;可以用subset把两个样本的细胞类型取成一致的。 1. 数据准备&#xff0c;分别创建CellChat对象 Sys.set…

Antd Select 添加中框

默认antd 的 Select中间并没有竖框&#xff0c;但是ui design设计了&#xff0c;所以记录一下如何添加 默认&#xff1a; CSS&#xff1a; .custom-select-suffix-icon {display: flex;align-items: center; }.custom-select-suffix-icon::before {content: ;height: 31px; …

1. Prism系列之数据绑定

Prism系列之数据绑定 文章目录 Prism系列之数据绑定一、安装Prism二、实现数据绑定三、更换数据源 一、安装Prism 创建一个WPF工程&#xff0c;创建名为 PrismNewSample 的WPF项目。 使用管理解决方案的Nuget包 在上面或许我们有个疑问&#xff1f; 为啥安装prism会跟Pri…

ICC2:如何调整floorplan原点位置

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 使用virtuoso layout或calibredrv改变原点位置可以参考专栏文章: Virtuoso layout如何改变原点坐标 ICC2中改变原点位置需要使用move_block_orgin命令,使用方法如下: move_block_origin -to [lind…

Epicypher:CUTANA™ E. coli Spike-in DNA

来源于Escherichia coli&#xff08;E.coli&#xff09;的片段DNA可以用作核酸酶靶向切割和释放&#xff08;CUT&RUN&#xff09;的实验标准化的spike-in对照。产品CUTANA™ E. coli Spike-in DNA含有足够的材料&#xff0c;可用于100-200个CUT&RUN样本&#xff08;高丰…

Win10错误代码0x80070005的解决方法

在Win10电脑操作过程中&#xff0c;用户可能会遇到各种各样的问题&#xff0c;从而影响到自己正常使用电脑办公。现在&#xff0c;就有用户遇到了错误码0x80070005的提示&#xff0c;但不清楚具体的解决方法。下面小编给大家分享不同的解决方法&#xff0c;解决后Win10电脑就能…

唇彩行业分析:我国彩妆细分品类市场占比63%

唇部彩妆是指在唇部起到化妆修饰作用的产品&#xff0c;包括口红/唇膏、唇蜜/唇彩/唇釉、唇笔/唇线笔、唇泥四大类。总体来看&#xff0c;目前我国唇部彩妆细分品类主要集中在唇膏/口红、唇蜜/唇彩/唇釉。唇笔/唇线笔市场接受程度较低&#xff0c;这是由于唇笔/唇线笔的主要成分…

Git克隆远程仓库SSH

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 首先我们需要创建SSH Key 先进入用户主目录&#xff0c;在目录下查找有没有.ssh目录&#xff0c;没有则创建&#xff0c;然后进入目录&#xff0c;查看是否有id_rsa 和 id_rsa.pub 两个⽂件&#xff0c;一个是私钥&#xff…

自动转文字源码系统,随时随地自由转换,附带完整的搭建教程

互联网上的信息形式多种多样&#xff0c;其中文本是最基本也是最常见的信息形式之一。然而&#xff0c;这些文本往往是以HTML、XML、Markdown等格式存储和呈现的&#xff0c;对于用户来说&#xff0c;这些格式的文本可读性较差&#xff0c;难以直接编辑和使用。因此&#xff0c…

道路清障车行业分析:中国市场发展趋势研究

清障车全名为道路清障车&#xff0c;又称拖车、道路救援车、拖拽车&#xff0c;具有起吊、拽拉和托举牵引等多项功能&#xff0c;清障车主要用于道路故障车辆&#xff0c;城市违章车辆及抢险救援等。清障车按类别主要分为&#xff1a;拖吊连体型、拖吊分离型&#xff0c;一拖一…

vue前端访问Django channels WebSocket失败

现象 前端报错&#xff1a;SSH.vue:51 WebSocket connection to ‘ws://127.0.0.1:8000/server/terminal/120.59.88.26/22/1/’ failed: 后端报错&#xff1a;Not Found: /server/terminal/120.79.83.26/22/1/ 原因 django的版本与channels的版本不匹配&#xff08;django…

es6从url中获取想要的参数

第一种方法 很古老&#xff0c;通过 split 方法慢慢截取&#xff0c;可行是可行但是这个方法有一个弊端&#xff0c;因为 split 是分割成数组了&#xff0c;只能按照下标的位置获取值&#xff0c;所以就是参数位置一旦发生变化&#xff0c;那么获取到的值也就错位了 let user…

Python框架批量数据抓取的高级教程

一、背景介绍 批量数据抓取是一种常见的数据获取方式&#xff0c;能够帮助我们快速、高效地获取网络上的大量信息。本文将介绍如何使用Python框架进行大规模抽象数据&#xff0c;以及如何处理这个过程中可能遇到的问题。 二、项目需求 我们将爬取大量知乎文章&#xff0c;讨…

【送书活动】探究AIGC、AGI、GPT和人工智能大模型

文章目录 前言01 《ChatGPT 驱动软件开发》推荐语 02 《ChatGPT原理与实战》推荐语 03 《神经网络与深度学习》推荐语 04 《AIGC重塑教育》推荐语 05 《通用人工智能》推荐语 后记赠书活动 前言 人工智能技术在过去几年中发展迅猛&#xff0c;得益于大数据、云计算、深度学习等…

论文润色改善附录内容质量 快码论文

大家好&#xff0c;今天来聊聊论文润色改善附录内容质量&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 标题&#xff1a;论文润色改善附录内容质量――提升论文的完整性与可读性 一、引言 附录是论文的…

【MySQL】——数据类型及字符集

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

【移动通讯】【MIMO】[P1]【科普篇】

前言&#xff1a; 前面几个月把CA 的技术总体复盘了一下,下面一段时间 主要结合各国一些MIMO 技术的文档,复盘一下MIMO. 这篇主要参考华为&#xff1a; info.support.huawei.com MIMO 技术使用多天线发送和接受信号。主要应用在WIFI 手机通讯等领域. 这种技术提高了系统容量&…

英飞凌芯片使用记录:程序运行放在RAM,规避ECC错误,操作Flash注意点

目录 1、程序放在RAM运行的方法&#xff08;Tasking&#xff09; 2、Tc3xx读取PF的时候关闭ECC错误方法 3、看门狗驱动放置在RAM避免总线错误。 4、Debug RAM与Debug Flash的区别 5、Tasking生成的HEX不是按照PFLASH的页大小作为start&#xff0c;或者存在多个程序块需要合…