【Linux】线程Pthread的概念 | NPTL线程库函数

news2024/9/20 20:32:06

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥Linux系列专栏:Linux基础 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述


目录

  • 一、线程的概念
  • 二、线程和进程
    • 进程退化
    • 多个线程在进程中共享资源有哪些?
  • 二、线程函数
    • 创建线程
    • 获取线程id
    • 线程回收
    • 线程退出
    • 线程取消
    • 设置线程分离

一、线程的概念

线程是操作系统能够进行调度和执行的最小单位。它是进程内执行的一个独立单元,与同一进程中的其他线程共享进程的地址空间和系统资源。

线程能减少程序在并发执行时所付出的时空开销,使操作系统具有更好的并发性。

二、线程和进程

一般情况下进程包含线程,线程比进程更轻量(体积更小,开销更小)

进程是最小的分配资源单位,线程是最小的调度单位

线程不分配内存,线程创建于进程中,与进程共享资源,访问进程的内存,完成特定任务

类 Unix 系统中,早期是没有“线程”概念的,80 年代才引入,借助进程机制实现出了线程的概念。因此在这类系统中,进程和线程关系密切
轻量级进程(light-weight process)也有 PCB,创建线程使用的底层函数和进程一样,都是 clone
从内核里看进程和线程是一样的,都有各自不同的 PCB,但是 PCB 中指向内存资源的三级页表是相同的
进程可以退化成线程
线程可看做寄存器和栈的集合,线程可以占用时间片使用cpu,可以通过保存和恢复处理器现场避免寄存器冲突,所以线程是一个合格的调度单位。
在 linux下,线程最是小的执行单位;进程是最小的分配资源单位
多线程可以共享资源,减少内存开销

进程退化

如果进程中创建了新的线程,那么进程原本的执行单元成为主控线程,新创建的成为普通线程,便于区分和理解。

线程分为内核级线程KLT和用户级线程ULT

cpu会给每个内核级线程分配内核对象,与进程一样获取cpu

  • 优点:内核级线程可以得到更多的系统资源,缩短任务完成时间
  • 缺点:所有的线程资源分配、访问和上下文切换都需要系统干预,开销较大

系统无法识别用户级线程,无法将资源分发给普通线程,只会给用户级进程

普通线程虽然无法直接被系统分发资源,但是可以使用cpu(可以主线程sleep(0)放弃时间片,给同进程下的普通进程时间片)
优点:用户级线程的创建、撤销和切换与OS内核无关,由用户空间中的线程库完成,系统调度开销小

多个线程在进程中共享资源有哪些?

  • 1.全局变量
  • 2.文件描述符
  • 3.PCB
  • 4.堆空间
  • 5.信号处理行为

非共享资源:

  • 1.线程栈
  • 2.TCB
  • 3.优先级指针·
  • 4.信号屏蔽字
  • 5.errno全局变量

二、线程函数

创建线程

int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*start_rountn)(void *), void *arg);

返回值:

  • 创建成功 返回0
  • 创建失败 返回errno

参数:

  • tid:传出参数,表示为创建的子线程id
  • attr:线程属性,传 NULL代表默认属性
  • start_rountn:子线程回调函数,函数指针,为线程工作地址。ptherad_create函数返回时,该函数会被自动调用
  • arg:start_rountn函数参数,系统创建线程后调用start_rountn后把arg传入twk函数中
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

void* job(void* arg)
{
	//子线程
	while(1)
	{
		printf("child thread running...\n");
		sleep(1);
	}
}

int main()
{
	//主线程
	pthread_t tid;
	int err;
	
	if( (err = pthread_create(&tid,NULL,job,NULL) ) > 0)
	{
		printf("thread_create failed:%s\n",strerror(err));
		exit(0);
	}
	while(1)
	{
		printf("parent thread running...\n");		
		sleep(1);
	}
	return 0;
}

在这里插入图片描述

获取线程id

pthread_t pthread_self();

返回值:

  • 本线程id

主线程创建成功后传出tid,与普通线程内部获取的tid 值相等,但是不等价

线程内部id即pthread_self()可以保证线程当前有效性,但是其他线程中的tid即创建线程时传出的tid无法保证是否存活

线程回收

如果不回收将会引发僵线程(TCB)残留

void pthread_join(pthread_t tid,void** retval);

阻塞函数,线程未退出会等待,退出后立即回收
返回值:

  • 创建成功返回0
  • 创建失败返回errno

函数参数:

  • tid:待回收的线程id
  • reval:传出参数,为线程函数的返回值

线程退出

pthread_exit((void*)retval)

返回值:

  • 创建成功返回0
  • 创建失败返回errno

函数参数:

  • reval:传出参数,为线程函数的返回值

线程取消

pthread_cancel(pthread_t tid);

返回值:

  • 创建成功返回0
  • 创建失败返回errno

函数参数:

  • tid:待取消的线程id

可以将目标线程杀死,不能保证杀掉。只有目标线程内有系统调用如printf、sleep,才能杀掉
可以使用pthread_testcancel()函数 触发一次系统调用,不进行其他操作。

被 cancel 杀死的线程再用 pthread_join 回收,返回值为-1

设置线程分离

int pthread_detach(pthread_t tid);

返回值:

  • 成功:0
  • 失败:errno

得到线程的返回值,使用回收态。系统自动回收使用分离态


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

10个优化Instagram SEO的必学策略

Instagram SEO 是优化 Instagram 内容以使其在平台搜索结果中被发现的做法。如果你希望你可以更快的让你的Ins获得流量&#xff0c;做好SEO就成功了一半。Instagram 搜索结果包括相关内容、帐户、音频、主题标签和地点&#xff0c;下面为你总结10个策略技巧&#xff01; 一、In…

矩阵的正定(positive definite)性质的作用

1. 定义 注意&#xff0c;本文中正定和半正定矩阵不要求是对称或Hermite的。 2. 性质 3. 作用 &#xff08;1&#xff09;Axb直接法求解 cholesky实对称正定矩阵求解复共轭对称正定矩阵求解LDL实对称非正定矩阵求解复共轭对称非正定矩阵求解复对称矩阵求解LU实非对称矩阵求解…

【新书推荐】6.3 switch语句

本节必须掌握的知识点&#xff1a; 示例代码二十一 代码分析 汇编解析 6.3.1 示例二十一 ■switch语句形式 switch语句是一种多路判断语句&#xff0c;会根据不同的选项&#xff0c;跳转到不同的分支语句。 switch语句的语法格式&#xff1a; switch(Controlling Expr…

情报搜集神器:Spiderfoot 保姆级教程

一、介绍 SpiderFoot是一款开源的情报搜集和足迹分析工具&#xff0c;用于自动化收集有关目标的信息。它被设计为一种开放式情报&#xff08;OSINT&#xff09;工具&#xff0c;可以帮助安全专业人员、渗透测试人员和研究人员收集、分析和汇总来自互联网的信息。 以下是 Spid…

java的excel列行合并模版

1.效果 2.模版 <tableborder"1"cellpadding"0"cellspacing"0"class"tablebor"id"TABLE"><tr align"center" class"bg217"><td style"background-color: #008000; color: #ffffff;p…

华为数通方向HCIP-DataCom H12-821题库(单选题:441-460)

第441题 下面是一台路由输出的信息,关于这段信息描述正确的是 <R1>display bgp peerBGP local router ID : 2.2.2.2Local AS number : 100Total number of peers : 2 Peers in established state : 0Peer V AS MsgRcvd MsgSent OutQ Up/Down …

fgcvbnm

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

离谱!英国大学53%本科生用AI写论文!留学生该如何面对AI冲击?

随着AI的不断强化和更新换代&#xff0c;越来越多的学生开始使用人工智能辅助写论文&#xff0c;能省去不少信息搜集的时间。 英国大学从最开始的明令禁止&#xff0c;到如今也在逐步接受学生将它用做辅助工具&#xff1a; 然而&#xff0c;AI的使用其实还存在很多问题&#xf…

蓝桥杯省赛无忧 课件137 第20次学长直播带练配套课件

01 树上异或 02 森林的最大美丽值 03 古老文明的数字仪式

3、生成式 AI 如何帮助您改进数据可视化图表

生成式 AI 如何帮助您改进数据可视化图表 使用生成式 AI 加速和增强数据可视化。 图像来源:DALLE 3 5 个关键要点: 数据可视化图表的基本结构使用 Python Altair 构建数据可视化图表使用 GitHub Copilot 加快图表生成速度使用 ChatGPT 为您的图表生成相关内容使用 DALL-E 将…

Token、CAS、JWT和OAuth 2.0认证系统认证中心系统设计对比与实践总结

在现代应用开发中&#xff0c;身份认证是一个关键的问题。为了解决身份认证的需求&#xff0c;开发人员可以选择不同的认证系统&#xff0c;如Token、CAS&#xff08;Central Authentication Service&#xff09;和JWT&#xff08;JSON Web Token&#xff09;OAuth 2.0认证系统…

“掌握温度,感知湿度,一触即知!”DHT11温湿度传感器,为您的生活增添一份关怀与精准。#非标协议【下】

“掌握温度&#xff0c;感知湿度&#xff0c;一触即知&#xff01;”DHT11温湿度传感器&#xff0c;为您的生活增添一份关怀与精准。#非标协议【下】 前言预备知识1.DHT11温湿度传感器初识1.1产品概述1.2与51单片机接线1.3数据传送逻辑和数据格式 2.发送时序检测DHT11温湿度传感…

无心剑小诗《醉爱平凡人生》

醉爱平凡人生 平凡人生&#xff0c;别样卓越 做调色板上最亮的颜料 没有豪华光环与繁杂束缚 只有一份简单的快乐 不追求虚名&#xff0c;不被物欲左右 安静地享受生活&#xff0c;品味每滴雨露 平凡人生&#xff0c;宛如流淌的小溪 没有壮烈激流&#xff0c;却有恒久细流 不…

Java中处理I/O操作的不同方式:BIO,NIO,AIO

Java中处理I/O操作的不同方式&#xff1a;BIO&#xff0c;NIO&#xff0c;AIO 亲爱的朋友&#xff0c; 在这美好的时刻&#xff0c;愿你感受到生活的温暖和欢乐。愿你的每一天都充满着笑容和满足&#xff0c;无论面对什么挑战都能勇往直前&#xff0c;化解困境。 希望你的心中充…

LeetCode:26.删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 目录 题目&#xff1a; 思路&#xff1a; 代码注释&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路&#xff1a; 没啥特殊的&#xff0c;老老实实双指针遍历数组&#xff0c;&#xff0…

2024.2.6日总结(小程序开发3)

页面配置 页面配置和全局配置的关系&#xff1a; 小程序中&#xff0c;app.json中的window节点&#xff0c;可以全局配置小程序中每个页面的窗口表现 如果某些小程序想要有特殊的窗口表现&#xff0c;可以用页面级别的.json配置文件实现这个需求 页面配置和全局配置冲突时&…

企业计算机服务器中了mallox勒索病毒怎么办,mallox勒索病毒处理流程

由于网络技术的不断发展与应用&#xff0c;越来越多的企业开始依赖计算机技术来提高企业效率。然而&#xff0c;网络安全威胁无处不在&#xff0c;严重影响着企业计算机服务器中的数据安全。近期&#xff0c;云天数据恢复中心接到许多中大型企业的求助&#xff0c;企业的多台服…

国产数据库 GBase 8a 安装

一、GBase简介 GBase 是南大通用数据技术有限公司推出的自主品牌的数据库产品&#xff0c;在国内数据库市场具有较高的品牌知名度。 二、下载地址&#xff08;需要先注册账号&#xff09; https://www.gbase.cn/download/gbase-8a?categoryINSTALL_PACKAGE 三、环境 服务…

Python(20)正则表达式(Regular Expression)中常用函数用法

大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 正文 正则表达式 粗略的定义&#xff1a;正则表达式是一个特殊的字符序列&#xff0c;帮助用户非常便捷的检查一个字符串是否符合某种模…

小白代码审计入门

最近小白一直在学习代码审计,对于我这个没有代码审计的菜鸟来说确实是一件无比艰难的事情。但是着恰恰应了一句老话:万事开头难。但是小白我会坚持下去。何况现在已经喜欢上了代码审计,下面呢小白就说一下appcms后台模板Getshell以及读取任意文件,影响的版本是2.0.101版本。…