一.多线程程序设计
1. 线程概述:
1.1  什么是线程?
线程是进程中的一个实体(组成单元),是系统进程调度的最小单元。
一个进程至少具有一个线程,如果进程仅有一个线程,该线程就代表
进程本身。把代表进程本身的线程称为主线程,一个进程中的多个线程,
共享进程地址空间,且可以并发执行。

    1.2 多线程程序设计?
在一个进程中通过启动多个线程完成不同功能任务的程序设计方法,称为多线程程序设计。

     *****注意:主线程代表了进程本身,主线程一旦退出则进程结束,系统回收进程资源,
所以在多线程程序设计中,一定不要让主线程先于其他线程退出。

    1.3  多线程程序设计的优缺点:

         1.资源消耗少.  创建线程不需要额外的系统资源,仅需要一点点线程赖以运行的栈资源。
2.效率高,     系统对线程的调度所花费的时间要远远的小于进程。
3.线程不需要众多的通讯方式。线程共享进程地址空间

     不足:
线程数据是共享的,共享资源会带来资源访问的同步或互斥问题,
幸运的是: 系统提供了众多成熟的解决方法来处理同步或互斥问题,
所以多线程程序设计的优势得到了最大程度的体现。

1.4 线程的基础操作

          1) 线程创建
pthread_create
函数头文件    #include <pthread.h> 
函数原型:     int pthread_create(pthread_t *id,const pthread_attr_t *attr,
void*(*routine)(void*),void* argp);
函数功能:    创建线程,编译时需要通过 -lpthread 链接线程库
函数参数:    id: [OUT] 获取创建后的线程的ID
attr:    线程属性,NULL表示创建缺省属性的线程
routine: 线程函数的入口地址
argp:    传递给线程函数的参数
函数返回值:  成功返回0
返回错误码

2) 线程ID获取
pthread_self
函数头文件    #include <pthread.h> 
函数原型:     pthread_t pthread_self(void);
函数功能:    获取调用线程ID,编译时需要通过 -lpthread 链接线程库
函数参数:    无
函数返回值:  调用线程ID
该函数不会失败
3) 线程退出
pthread_exit
函数头文件    #include <pthread.h> 
函数原型:     void pthread_exit(void* retval);
函数功能:    线程退出,编译时需要通过 -lpthread 链接线程库
函数参数:    retval: 线程退出后,返回的数据地址
函数返回值:  无
4) 线程等待
pthread_join
函数头文件    #include <pthread.h> 
函数原型:     int pthread_join(pthread_t id,void** retval);
函数功能:    阻塞调用线程,直到等待的线程退出,编译时需要通过 -lpthread 链接线程库
函数参数:    id: 等待的目标线程的ID
retval:用于接收线程退出时返回的地址
函数返回值:  成功返回0
返回错误码

           注意:  1. 线程等待不限于主线程与子线程之间,子线程也可以等待另一个子线程退出;
2. 同一个不能被等待多次
3. 不是所有线程都可以被等待(分离属性的线程是不可被等待的)
4. 线程等待的目的:
1) 需要获取指定线程的返回数据;
2) 回收等待的目标线程的资源;
3) 阻塞调用线程,
5) 线程取消
pthread_cancel
函数头文件    #include <pthread.h> 
函数原型:     int pthread_cancel(pthread_t id);
函数功能:    向目标线程发送退出请求,编译时需要通过 -lpthread 链接线程库
函数参数:    id: 取消的目标线程的ID
函数返回值:  成功返回0
返回错误码

           pthread_setcanceltype
函数头文件    #include <pthread.h> 
函数原型:     int pthread_setcancelstate(int state,int* oldstate);
函数功能:    设置线程退出状态,编译时需要通过 -lpthread 链接线程库
函数参数:    state: 新设置的状态值,取值如下:
PTHREAD_CANCEL_ENABLE:    接受退出请求
PTHREAD_CANCEL_DISABLE:   拒绝退出请求
oldstate:[OUT] 获取原状态值
函数返回值:  成功返回0
返回错误码
6) 线程清理
pthread_cleanup_push / pthread_cleanup_pop
函数头文件    #include <pthread.h> 
函数原型:     void pthread_cleanup_push(void(*rtn)(void*),void* argp);
void pthread_cleanup_pop(int execute);
函数功能:    pthread_cleanup_push: 为线程设置清理函数,
pthread_cleanup_pop: 取消清理函数    
编译时需要通过 -lpthread 链接线程库
函数参数:    rtn: 清理函数的入口地址
argp: 传递给清理函数的参数
execute:非0时,在取消清理函数之前先调用后取消
0直接取消
函数返回值:  无

           注意: 1. 这两个函数要成对使用,且调用次数严格对等。
2. 在具体使用过程中,用这两个函数尽可能多的"包裹"线程函数代码,
pthread_cleanup_pop放置在线程函数的最末尾(return语句之前),
并传递0参数。

   1.5 线程属性及设置

      1. 线程属性
typedef struct
{
int                            detachstate;     //线程的分离状态
int                            schedpolicy;     //线程调度策略
struct sched_param             schedparam;     //线程的调度参数
int                            inheritsched;    //线程的继承性
int                            scope;             //线程的作用域
size_t                         guardsize;        //线程栈尾警戒缓冲区大小
int                            stackaddr_set;
void *                         stackaddr;       // 线程栈的位置
size_t                         stacksize;       // 线程栈的大小
}pthread_attr_t;

      2. 属性设置
2.1  初始化属性对象(结构体变量)
pthread_attr_init

            2.2   利用属性设置相关函数设置属性对象
pthread_attr_setdetachstate
pthread_attr_setstacksize

        2.3  利用设置好以后的属性对象创建线程。

        2.4   回收属性对象
pthread_attr_destroy 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 + TS + MapboxGL.js 三维地图开发项目

文章目录 1. 安装依赖 2. 新建 Map 组件(components/MapView.vue) 3. 在页面中使用(views/Home.vue) 4. 效果说明 1. 安装依赖 npm install mapbox-gl @types/mapbox-gl --save⚠️ 注意:需要去 Mapbox 官网,申请一个 access token。 package.json {"name":…

【编程语言】Rust 入门

目录 一、Rust 是什么&#xff1f;为什么选择它&#xff1f; 二、环境搭建&#xff0c;迈出第一步 2.1 Windows 系统安装步骤 2.2 macOS 系统安装步骤 2.3 Linux 系统安装步骤 2.4 安装过程中的常见问题及解决方案 三、基础语法&#xff0c;构建知识大厦的基石 3.1 变量…

Python 编码与加密全解析:从字符编码到 RSA 签名验证

在 Python 开发中&#xff0c;字符编码&#xff08;如 UTF-8、GBK&#xff09;和 数据加密&#xff08;如 Base64、MD5、RSA&#xff09;是处理数据传输、存储安全的核心技术。本文结合实战代码&#xff0c;从基础的字符编解码入手&#xff0c;逐步深入到加密算法的应用&#x…

关于shell命令的扩展

目录 一、逻辑运算符 1. &&&#xff08;AND&#xff09; 2. ||&#xff08;OR&#xff09; 3. 组合使用&#xff1a;A && B || C 二、输出与重定向 1. echo 输出 2. 标准文件描述符&#xff08;FD&#xff09; 3. 重定向操作符 4. 同时重定向 stdout 和…

MySQL EXPLAIN 查看执行计划详解

MySQL 的 EXPLAIN 命令。这是一个分析和优化 SQL 查询性能不可或缺的强大工具。它展示了 MySQL 如何执行一条 SQL 语句&#xff0c;包括如何使用索引、表连接顺序、估计的行数等关键信息。1. 如何使用 EXPLAIN在你要分析的 SELECT 语句前加上 EXPLAIN 或 EXPLAIN FORMATJSON&am…

TensorFlow 面试题及详细答案 120道(51-60)-- 模型保存、加载与部署

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 51. TensorFlow中保存和加…

从零开始学Shell编程:从基础到实战案例

从零开始学Shell编程&#xff1a;从基础到实战案例 文章目录从零开始学Shell编程&#xff1a;从基础到实战案例一、认识Shell&#xff1a;是什么与为什么学1.1 Shell的定义1.2 常用Shell解释器二、Shell编程快速入门&#xff1a;编写第一个脚本2.1 步骤1&#xff1a;创建脚本文…

机器学习算法全景解析:从理论到实践

机器学习算法全景解析&#xff1a;从理论到实践引言机器学习作为人工智能的核心组成部分&#xff0c;正在深刻地改变我们的世界。从推荐系统到自动驾驶&#xff0c;从医疗诊断到金融风控&#xff0c;机器学习算法无处不在。本文将全面系统地介绍机器学习的主要算法类别及其核心…

week5-[二维数组]对角线

week5-[二维数组]对角线 题目描述 给定一个 nnn\times nnn 的正方形二维数组&#xff0c;输出它两条对角线上元素的和。 输入格式 输入共 n1n 1n1 行。 第 111 行 111 个正整数 nnn。 接下来 nnn 行&#xff0c;每行 nnn 个正整数 aija_{ij}aij​ 表示这个二维数组。 输出格式…

GoogLeNet:深度学习中的“卷积网络变形金刚“

大家好&#xff01;今天我们要聊一个在深度学习领域掀起革命的经典网络——GoogLeNet&#xff08;又称Inception v1&#xff09;。这个由Google团队在2014年提出的模型&#xff0c;不仅拿下了ImageNet竞赛冠军&#xff0c;更用"网络中的网络"设计理念彻底改变了卷积神…

笔记本电脑蓝牙搜索不到设备-已解决

方法1打开疑难解答&#xff0c;选择其他疑难解答&#xff0c;下划选择蓝牙&#xff0c;点击运行&#xff0c;电脑自行检测并修复蓝牙方法2右键此电脑&#xff0c;选择管理&#xff0c;找到自己的蓝牙设备。然后对箭头指向的这个点击右键&#xff0c;选择《更新驱动程序》&#…

WPF 程序用户权限模块利用MarkupExtension实现控制控件显示

工作记录 ------------------------------------------------------------------------------------------------------- MarkupExtension:XAML标记扩展 实现了什么作用&#xff1a;通过扩展标记将一种输入转化为另一种类型的输出 思路&#xff1a; 不直接设置控件的Visib…

SpringMVC相关梳理

SpringMVC 返回值类型&#xff08;一&#xff09;核心返回值类型分类视图渲染类&#xff1a;用于跳转并渲染页面&#xff0c;如String&#xff08;指定视图名&#xff09;、ModelAndView&#xff08;视图 数据&#xff09;。数据返回类&#xff1a;用于返回数据&#xff08;而…

Docker化性能监控平台搭建:JMeter+InfluxDB+Grafana全攻略

你作为一名DevOps工程师或测试专家&#xff0c;正在监控一个高并发微服务系统&#xff1a;突发流量峰值导致响应延迟&#xff0c;服务器CPU飙升&#xff0c;但你只能手动查看日志&#xff0c;优化起来像大海捞针。这时&#xff0c;DockerJMeterInfluxDBGrafana的“梦幻四重奏”…

Adobe Acrobat 中通过 JavaScript 调用 Web 服务

强大的JavaScript支持&#xff0c;允许用户通过脚本自动化处理PDF文档。本文将详细介绍如何在Adobe Acrobat环境中使用JavaScript调用Web服务&#xff0c;包括基础概念、实现方法、代码示例以及常见问题解决方案。 第一部分&#xff1a;基础概念与技术背景 1.1 Acrobat JavaScr…

SpringCloud OpenFeign 远程调用(RPC)(三)

目录 1 概念导入 2 添加依赖 3 在启动类上添加注解 4 编写对应的接口 5 注入并调用 6 日志 7 超时控制 8 超时重试 9 拦截器 10 Fallback兜底 1 概念导入 Spring Cloud OpenFeign Features :: Spring Cloud Openfeign 2 添加依赖 <!-- 远程调用 --><depen…

【Flask】测试平台开发,登陆重构

概述我们在开篇的时候实现了简单的登陆功能&#xff0c;也实现了一个前后端联调的登陆功能&#xff0c;但是你有没有发现&#xff0c;那个登陆只是一个简单的登陆&#xff0c;且密码在接口返回的过程中是铭文密码&#xff0c;在生产环境中使用肯定是不行的&#xff0c;一般密码…

【Bluedroid】A2DP Source设备音频数据读取机制分析(btif_a2dp_source_read_callback)

本文聚焦Android 蓝牙 A2DP Source设备的音频数据读取核心逻辑,深入解析关键回调函数btif_a2dp_source_read_callback的功能实现,包括从 HAL(硬件抽象层,支持 HIDL/AIDL 两种传输方式)或 UIPC(用户空间进程间通信)获取音频数据的路径选择机制,以及数据下溢(Underflow)…

多方调研赋能AI+智慧消防 豪越科技人工智能创新获认可

8月26日&#xff0c;中国职业安全健康协会城市及社区安全发展专业委员会秘书长汪卫国以及常务副秘书长黄强亮等诸位领导到访委员单位豪越科技&#xff0c;展开了实地的调研活动并给予相关指导。此次调研着重于了解豪越科技自主研发的“AI消防救援一体化安全管控平台”&#xff…

算法---字符串

一、算法说明 字符串是一种类型&#xff0c;他不是一种算法&#xff0c;所以我们在处理这方面的问题的时候&#xff0c;需要结合其他的算法 二、题目 最长公共前缀 1、题目 最长公共前缀 2、解题思路 解法一&#xff1a;我们可以先让两个相互比较&#xff0c;然后在将比较…