【Linux】线程控制:线程创建、终止、等待、分离等

注意: 以下所有的接口都是使用的Linux下的原生线程库,所有g++/gcc编译的时候需要加上参数-lpthread,编译pthread动态库。

1、线程的创建pthread_create

相关接口,创建线程函数,成功返回0,失败返回一个错误码。

#include<pthread.h>
int pthread_create(pthread_t* thread,const pthread_attr_t *attr,
void*(*start routine)(void*),void* arg);
  • pthread_t* thread:内核数据类型,输入型参数,获取线程ID。
  • const pthread_attr_t *attr:用于定制各种不同的线程属性,一般置空NULL,这里不提倡自定义设置,因为没有比操作系统最了解线程的属性。
  • void*(start routine)(void):函数指针,线程创建出来所要执行的函数,新创建的线程从start_rtn函数的地址开始运行,该函数只有一个void*类型的参数arg
  • void* arg:想给所创建的线程传入的参数,即线程执行函数中的参数。如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构体中,然后把这个结构的地址作为arg参数传入

2.获取线程id,pthread_self

不应使用全局变量 pthread_t tid,在子线程中通过pthread_create传出参数来获取线程ID,而应使用pthread_self。线程ID是进程内部,识别标志。(两个进程间,线程ID允许相同)

#include<pthread.h>
pthread_t pthread_self(void)
//在哪个线程内部调用,即返回哪个线程的线程ID

3.线程等待pthread_join

一般而言,线程也是需要被等待的,如果不等待,可能会导致类似于”僵尸进程“的问题!看一下相关接口,如下:
成功返回0,失败返回一个错误码。

#include<pthread.h>
int pthread_join(pthread_t thread,void **retval);
  • pthread_t thread:线程ID,要等待哪个线程
  • void **retval:输出型参数,用来获取新线程退出的时候,函数的返回值,即获取线程的退出状态。

代码异常的情况需不需要线程处理???
我们都知道,代码的运行存在三种情况:1.代码运行完结果对。2.代码运行完结果不对。3.代码异常。对于1和2的情况都会有相应的返回值接收,但是对于第3种情况,线程不需要处理,这是进程需要关心的。
此外,如果线程在运行的过程中出现问题,异常崩溃,会导致整个进程崩溃掉!!!

4.线程终止pthread_exit

#include<pthread.h>
void pthread_exit(void *retval)
  • retval:表示线程退出状态,通常传NULL。

注意:
线程中,禁止使用exit函数,会导致进程内所有线程全部退出。
在不添加sleep控制输出顺序的情况下。pthread_create在循环中,几乎瞬间创建5个线程,但只有第1个线程有机会输出(或者第2个也有,也可能没有,取决于内核调度)如果第3个线程执行了exit,将整个进程退出了,所以全部线程退出了。
  所以,多线程环境中,应尽量少用,或者不使用exit函数,取而代之使用pthread_exit函数,将单个线程退出。任何线程里exit导致进程退出,其他线程未工作结束,主控线程退出时不能return或exit。
  另注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。

线程调用return、pthread_exit、exit总结:
   return:返回到调用者那里去。
   pthread_exit():将调用该函数的线程
   exit: 将进程退出。

此处借鉴于:[https://blog.csdn.net/qq_44177918/article/details/130442584]

5.取消目标线程pthread_cancel

取消目标线程也是线程终止的一种,下面让我们来看一下取消目标线程的接口。

#include<pthread.h>
int pthread_cancel(pthread_t thread)

6.线程分离pthread_detach

上面讲了,线程是需要等待的,否则会出现像僵尸进程一样的问题,那么如果不想等待呢?线程库提供了一种接口,采用线程分离的方法,分离之后的线程不需要被join,运行完毕之后,会自动释放Z状态下的PCB控制块。线程分离的接口,如下:

#include<pthread.h>
int pthread_detach(pthread_t thread);

注意:一个线程被设置为分离之后,绝对不能进行join了!!!主线程不退出,新线程处理业务处理完毕在退出!

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

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

相关文章

DOS 系统(命令行)

文章目录 DOS 系统DOS 常用命令DOS 高级命令DOS 批处理命令DOS 应用场景 DOS 系统 操作系统的发展史&#xff08;DOS/Windows篇&#xff09; DOS操作系统的历史 DOS&#xff08;Disk Operating System&#xff09; 是 磁盘操作系统 的缩写&#xff0c;是一种早期的个人计算机操…

HashMap构造函数解析与应用场景

目录 1. HashMap简介 2. HashMap的构造函数 2.1 默认构造函数 2.2 指定初始容量和加载因子的构造函数 3. 构造函数参数的影响 3.1 初始容量的选择 3.2 加载因子的选择 4. 构造函数的应用场景 4.1 默认构造函数的应用场景 4.2 指定初始容量和加载因子的构造函数的应用…

10天玩转Python第8天:python 文件和异常 全面详解与代码示例

今日内容 文件操作 普通文件的操作json 文件的操作[重点] 异常处理(程序代码运行时的报错) 文件介绍 计算机的 文件&#xff0c;就是存储在某种 长期储存设备 上的一段 数据 作用: 将数据长期保存下来&#xff0c;在需要的时候使用 ​ 1.计算机只认识 二进制(0 1) 2.文件中…

myBatis-plus自动填充插件

在 MyBatis-Plus 3.x 中&#xff0c;自动填充的插件方式发生了变化。现在推荐使用 MetaObjectHandler 接口的实现类来定义字段的填充逻辑。以下是使用 MyBatis-Plus 3.x 自动填充的基本步骤&#xff1a; 1.基本配置 1.1添加 Maven 依赖&#xff1a; 确保你的 Maven 依赖中使…

10天玩转Python第9天:python 面向对象 全面详解与代码示例

今日内容 异常 模块和包 导入模块(导包)if __name__ "__main__": Unitest 框架的学习 了解, 基本组成 异常 异常传递[了解] 异常传递是 Python 中已经实现好了,我们不需要操作, 我们知道异常会进行传递. ​ 异常传递: 在函数嵌套调用的过程中, 被调用的函数 ,发…

Tailwind CSS

Tailwind CSS 简介,在这一课中,我们将初步了解下 Tailwind CSS 。 什么是 Tailwind CSS? Tailwind CSS 是一个 CSS 框架,它提供了一系列预定义的实用类,您可以使用这些实用类来快速构建网页。Tailwind CSS 的主要特点是,它可以让您只编写您需要的 CSS,从而减少代码量。…

Grafana Loki 快速尝鲜

Grafana Loki 是一个支持水平扩展、高可用的聚合日志系统&#xff0c;跟其他的聚合日志系统不同&#xff0c;Loki只对日志的元数据-标签进行索引&#xff0c;日志数据会被压缩并存储在对象存储中&#xff0c;甚至可以存储在本地文件系统中&#xff0c;能够有效降低成本&#xf…

下午好~ 我的论文【遥感】(第一期)

写在前面&#xff1a;下午浑浑噩噩&#xff0c;泡杯茶&#xff0c;读篇论文吧 首先说明&#xff0c;时间有限没有那么精力一一回复了&#xff0c;对不起各位了TAT 文章目录 遥感Bi-Dilation-formerCNN-GNN-FusionMulti-hierarchical cross transformerCoupled CNNs 遥感 Bi-D…

NGINX日志配置参数

日志参数 参数说明示例$remote_addr客户端地址219.227.111.255$remote_user客户端用户名称—$time_local访问时间和时区14/Dec/202023:09:27:01 0800$time_iso8601访问时间2023-12-14T09:27:4508:00$request请求的URI和HTTP协议“GET /article-10000.html HTTP/1.1”$request…

Vue3 用 Proxy API 替代 defineProperty API 的那些事

一、Object.defineProperty 定义&#xff1a;Object.defineProperty() 方法会直接在一个对象上定义一个新属性&#xff0c;或者修改一个对象的现有属性&#xff0c;并返回此对象 1.1 为什么能实现响应式 通过defineProperty 两个属性&#xff0c;get及set get 属性的 gett…

电路中的屏蔽罩作用及设计

1.1 屏蔽罩作用 1.1.1 屏蔽电子信号,防止外界的干扰或内部向外的辐射&#xff1a; 一般见于通信类电路PCB&#xff0c;主要一个无线通信产品上有的敏感器件、模拟、数字电路、DCDC电源电路&#xff0c;都需屏蔽隔离&#xff0c;是为了不影响其它电路&#xff0c;也有防止其它电…

国际刑警组织推出新的生物识别系统

2023 年 11 月 29 日&#xff0c;国际刑警组织发布了一份有关创建生物识别工具的新闻稿&#xff0c;至少在意大利&#xff0c;该工具似乎已经陷入沉默&#xff0c;但让我们看看为什么我们会对这个东西感兴趣。 国际刑警组织的新闻稿用了整整一段时间来讨论与隐私相关的问题&am…

0x31 质数

0x31 质数 定义&#xff1a; 若一个正整数无法被除了1和它自身之外的任何自然数整除&#xff0c;则称该数为质数&#xff08;或素数&#xff09;&#xff0c;否则则称该正整数为合数。 在整个自然数集合中&#xff0c;质数的数量不多&#xff0c;分布比较稀疏&#xff0c;对…

【加解密】报文签名与加解密,MD5,RSA,AES使用案例(基于 Java)

需要考虑哪些问题&#xff1f; 在进行报文传输时&#xff0c;有两个问题需要考虑&#xff1a; 消息防篡改加密报文 定义消息结构 为了方便后面使用&#xff0c;这里定义消息结构&#xff1a; public static class Message {public String data; //消息public String sign;…

【Linux】Firewalld防火墙新增端口、开启、查看等

Linux操作系统中&#xff0c;Firewalld防火墙相关操作如下&#xff1a; 安装 yum install firewalld firewalld-configFirewall开启常见端口命令 新增端口&#xff1a; firewall-cmd --zonepublic --add-port80/tcp --permanentfirewall-cmd --zonepublic --add-port443/tc…

动态规划——OJ题(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、第N个泰波那契数1、题目讲解2、思路讲解3、代码实现 二、三步问题1、题目讲解2、思路讲解…

Maven配置文件setings.xml详解依赖搜索顺序详解

Maven配置文件详解 文章目录 Maven配置文件详解一、settings.xml配置文件的作用二、settings.xml元素详解0.示例1.LocalRepository2.InteractiveMode3.UsePluginRegistry4.Offline5.PluginGroups6.Servers7.Mirrors8.Proxies9.Profiles10.Activation11.properties12.Repositori…

拖拽属性 draggable

H5 新增的属性 draggable&#xff0c;它能够给与一切的 html 元素拖动的效果。 拖拽元素 属性为 draggable"true" 的元素&#xff0c;可拖动&#xff0c;且拖动时鼠标变为禁用图标 ps: 直接写 draggable 可能无效 ondragstart 开始拖拽时触发&#xff08;按下鼠标…

ARM架构简析

全局与局量等知识 断电后&#xff0c;程序以及数据都在FLASH中。 断电后&#xff0c;内存中就没有变量了。 程序在烧在FLASH中的&#xff1b; 程序运行的时候&#xff0c;全局变量的初始值&#xff0c;必然是从FLAASH中的来的&#xff1a; 初始化全局变量的过程&#xff1a;…

【微服务】服务间调用

当我们的应用从一个大单体拆分成多个微服务之后&#xff0c;服务间调用有多少种方式&#xff1f;服务间调用如果出现超时&#xff0c;如果避免雪崩&#xff0c;即如何做限流熔断机制&#xff0c;原理是什么&#xff1f; 服务间调用方式 OpenFeign RestTemplate WebClient …