【Linux】线程-线程控制

news/2024/11/25 15:38:46/

线程控制

  • 线程控制
  • 线程创建
  • 线程终止
  • 线程等待
  • 分离线程

线程控制

使用线程需要注意的是,需要引入头文件pthread.h,并且在编译的时候,需要使用-lpthread

线程创建

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg)

thread:返回线程id
attr:设置线程的属性,attr为NULL表示使用默认属性
start_routine:函数地址,即线程启动时要执行的函数
arg:传递给线程启动函数的参数
返回值:成功返回0,失败返回错误码

需要注意的是:pthread_create函数会产生一个线程ID,存放在第一个参数指向的地址中,而指向的这个地址其实是指向一个虚拟内存单元,这个内存单元的地址就是新创建的线程ID。
传入的thread,它的类型的pthread_t类型,那么这个类型是什么呢?

当前linux实现的标准线程库中,pthread_t的类型本质上是一个进程地址空间的一个首地址。

在这里插入图片描述

线程终止

多个线程的编程而言,如果某个线程异常退出,会导致整个进程的退出,那么如果想要仅让某个线程退出,而不退出整个进程组,有三种方式。

returnpthread_exitpthread_cancel
退出当前线程,主线程除外谁调用谁退出退出当前进程组中其他的线程
void pthread_exit(void* value_ptr);

value_ptr:指向一个在堆上开辟的空间

int pthread_cancel(pthread_t thread);

thread:线程ID
返回值:成功返回0,失败返回错误码

线程等待

线程在CPU看来也是一个PCB,那么当一个线程退出的时候,就需要和进程一样,对其进行资源回收,否则会造成内存泄漏。那么就需要和进程一样,进行线程等待,让其他线程去回收即将要退出的线程。
使用的函数是pthread_join

int pthread_join(pthread_t thread, void** value_ptr)

参数:
thread:线程ID
value_ptr:指向一个指针,指针指向线程的返回值
返回值:成功返回0,失败返回错误码

注意:该函数为阻塞类型的函数,调用这个函数的线程将阻塞等待,直到被等待的线程退出,该函数才会返回。传递的value_ptr需要执行一块堆上的空间,而且在上述不同的线程终止情况下,通过pthread_join得到的终止状态也是不同的。
但是一般来说,由于工作线程的运行时间是非常长的,并且不会让线程执行完某项工作后就退出,而且我们一般不关心线程退出的状态信息,故我们会传递NULL给pthread_join的第二个参数。

分离线程

当我们使用pthread_create函数创建线程后,新创建的线程默认是joinable的,就是说需要程序猿自己写线程回收的代码,用于回收当线程终止后的线程资源。但是这样使用起来也不方便,还容易遗忘,因此当我们不关心线程终止的返回值,就可以让线程自己在终止的时候,让操作系统自动回收线程资源。

分离的方式有两种:自己主动分离自己,其他线程分离当前线程。

int pthread_detach(pthread_t thread);

参数:thread:线程id,可以传递自己的线程id,也就是pthread_self()


http://www.ppmy.cn/news/49822.html

相关文章

【java】maven 指定项目编译与打包的JDK版本

Maven 是一个流行的构建工具,用于管理 Java 项目的依赖项、构建和部署。在 Maven 中,可以指定项目的编译和打包所使用的 JDK 版本。本篇博客将介绍如何在 Maven 中指定项目的 JDK 版本,并讨论该选项对项目的影响。 指定 JDK 版本 在 Maven …

CrackMapExec 域渗透工具使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、CrackMapExec 是什么?二、简单使用1、获取帮助信息2、smb连接执行命令3、使用winrm执行命令(躲避杀软)4、smb 协议常用枚…

CSS背景相关属性

一、背景颜色 属性名:background-color (bgc) 属性值:颜色取值:关键字,rgb表示法,rgba表示法,十六进制表示。 注: 背景颜色默认透明:rgba(0,0&#xff0c…

从广交会,看懂海尔智家逆势增长的秘密

中国企业的全球化战略应从何处、以何种方式推进?作为行业全球化最彻底的企业,海尔智家是个很好的参考。 4月15日,在第133届中国进出口贸易交易会(以下简称“广交会”)上,海尔智家展示了其扎根本土&#xf…

java 拼接字符串的方法

1.拼接字符串的方法,先要将字符串转化为数字类型,再根据需要拼接。这样可以避免直接拼接导致的错误。 2.将字符串转化为数字类型,这个就是一个循环。可以使用循环的方法,但是循环次数不宜太多,否则容易出错。 3.可以使…

总结828

学习目标: 4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 学习内容: 暴力英语:回环诵读之前的文章,背150个单词,背《冰与火之歌》-守夜人誓词 高等数学&…

Flink高手之路6-Flink四大基石

文章目录 Flink四大基石一、Flink的四大基石1. Checkpoint2. State3. Time4. Window 二、案例1.需求2.代码实现3.运行,查看结果4.增加需求2的实现5.重启程序,查看结果 Flink四大基石 一、Flink的四大基石 Flink之所以能这么流行,离不开它最…

奇异值分解SVD

概念 奇异值分解(singular value decomposition)是线性代数中一种重要的矩阵分解。奇异值分解在某些方面与对称矩阵或厄密矩阵基于特征向量的对角化类似。然而这两种矩阵分解尽管有其相关性,但还是有明显的不同。对称矩阵特征向量分解的基础…