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

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥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.mzph.cn/news/671411.shtml

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

相关文章

华为、清华等开源超高清、精准文生图模型,0.5秒极速生成!

华为诺亚方舟实验室、清华大学信息科技学院、大连理工、香港大学和Hugging Face的研究人员&#xff0c;联合开源了超高清文生图模型——PIXART-δ。 研究人员将潜在一致性模型&#xff08;LCM&#xff09;和创新控制架构ControlNet-Transformer集成在PIXART-δ中&#xff0c;在…

【LeetCode: 73. 矩阵置零 + 矩阵】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

使用Python语言生成区块链地址

# 单次运行 import binascii import sha3 from ecdsa import SigningKey, SECP256k1priv SigningKey.generate(curveSECP256k1) # 生成私钥 pub priv.get_verifying_key() # 生成公钥keccak sha3.keccak_256() keccak.update(pub.to_string()) # keccak_256哈希运算 addr…

vue配置开发环境和生产环境

在与src文件夹同级的地方增加两个文件 .env.development .env.production配置development和production两个文件 在.env.development中写&#xff1a; NODE_ENV development VUE_APP_NUM dev //VUE_APP_自己取名字在.env.production中写&#xff1a; NODE_ENV production…

linux k8s 源码编译及单集群测试

目录 概述实践安装插件docker 在线安装containerd安装二进制安装yum安装修改containder配置文件 cnietcdrsyncgo设置golang代理 安装CFSSL下载kubernetes代码编译启动本地单节点集群问题k8s没有被正常启动该如何k8s正常启动日志测试 结束 概述 此文详细说明在 centos 7上编译 k…

QT上位机:串口调试助手

前言 上位机的简单编写可以帮我们测试并完善平台&#xff0c;QT作为一款跨平台的GUI开发框架&#xff0c;提供了非常丰富的常用串口api。本文先从最简单的串口调试助手开始&#xff0c;编写平台软件的串口控制界面 工程配置 QT 串口通信基于QT的QSerialPort类&#xff0c;先在…

【halcon】write_image 图片保存

前言 write_image 是一个可以用来保存图片的算子&#xff0c;可以将Image对象保存成各种格式的图片。还可以对图片进行压缩。 正文 参数&#xff1a; Image&#xff08;输入对象&#xff09;&#xff1a; 输入图像或输入图像的数组。支持的像素类型包括byte、direction、cy…

druid配置wall导致无法批量sql

1、现象 2、原配置 spring:autoconfigure:exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfiguredatasource:druid:stat-view-servlet:enabled: trueloginUsername: ***loginPassword: ***allow:web-stat-filter:enabled: truefilter:wall:conf…

MATLAB知识点:矩阵元素的引用

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章 3.3.2 矩阵元素的引用 在讲解矩阵元素的引用之…

【Unity优化(一)】音频优化

整理资教程&#xff1a;https://learn.u3d.cn/tutorial/unity-optimization-metaverse 1.音频优化 音频一般不会成为性能瓶颈&#xff0c;是为了节省内存和优化包体大小。 1.0 文件格式和压缩格式 原始音频资源尽量采用WAV格式。 移动平台音频尽量采用Vorbis压缩格式&#x…

net start mysql服务名无效|发生系统错误 解决办法

未输入正确的mysql服务名 解决办法&#xff1a; 使用net start命令查看可用的服务名&#xff0c;找到mysql的服务名 未使用管理员身份运行命令提示符 解决方法&#xff1a; 使用管理员身份运行命令提示符

背包2讲(2.6)

问题1&#xff1a;装箱问题 题解&#xff1a;这题其实本质上也是01背包&#xff0c;只不过算是变式&#xff0c;要求剩余空间最小值&#xff0c;我们可以转换成最大可以装多少的问题&#xff0c;然后就可以很快的写出题的答案 #include<bits/stdc.h> using namespace st…

Positive Technologies 帮助修复了流行的 Yealink 视频会议系统中的一个危险漏洞

Yealink 感谢我们的专家发现了视频会议系统 Yealink Meeting Server 中的一个关键漏洞 该公司在全球 IP 电话市场排名第一&#xff0c;是五大线上会议解决方案供应商之一&#xff0c;其产品已在 140 多个国家和地区使用。 漏洞 YVD-2023-1257833 (BDU:2024-00482) 属于操作系…

打包 iOS 的 IPA 文件

目录 摘要 引言 准备 选择证书类型 创建应用程序 设置应用程序标识和证书 配置构建设置 构建应用程序 导出IPA 签名和导出 代码案例演示 完成 总结 参考资料 摘要 本篇博客将为您介绍如何打包iOS的IPA文件。从APP提交、创建应用程序、设置应用程序标识和证书、配…

centos安装harbor

安装docker yum install epel-release yum-utils#docker官网源 yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repoyum install docker-ce -y 安装docker-compose curl -SL https://github.com/docker/compose/releases/download/v2…

【自然语言处理-工具篇】spaCy<1>--介绍及安装指南

目录 前言 安装指南 pip conda spaCy升级 总结 前言 spaCy是一个开源的自然语言处理库,用于处理和分析文本数据。它提供了许多功能,包括分词、词性标注

2023-总结

文章目录 工作贡献集成登录角色今年的工作感想 总结感想题外话 工作 今年也是换了公司。 在上个公司首先就是学到了技术&#xff0c;拓展了知识层面。至于离开&#xff0c;也是简单得想多去走走试试。感谢公司和同事的栽培和包容。 来到现在任职的公司同事也是非常友好。刚来…

EMC防护

EMI是指电子设备在自身工作过程中产生的电磁波&#xff0c;对外发射并对设备其它部分或外部其它设备造成干扰。EMI测试项目包括电源线传导骚扰&#xff08;CE&#xff09;测试、信号、控制线传导骚扰&#xff08;CE&#xff09;测试、辐射骚扰&#xff08;RE&#xff09;测试、…

记录关于node接收并解析前端上传excel文件formData踩的坑

1.vue2使用插件formidable实现接收文件&#xff0c;首先接口不可以使用任何中间件&#xff0c;否则form.parse()方法不执行。 const express require(express) const multipart require(connect-multiparty); const testController require(../controller/testController)/…

Android 横屏应用开发如何隐藏左边黑色边缘

最近公司开发一个横屏应用的项目&#xff0c;Phone和Pad一套代码编译&#xff0c;需要考虑到全局横屏状态下的应用&#xff0c;起初竖屏的时候代码是没问题的&#xff0c;可是到切换横屏遇到了黑边问题&#xff0c;先来看看竖屏的时候怎么写的 setContentView之前设置 getWind…