【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.hqwc.cn/news/456827.html

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

相关文章

假期刷题打卡--Day25

1、MT1204字母三角 请编写一个简单程序&#xff0c;输入正整数n&#xff0c;输出n行F字三角 格式 输入格式&#xff1a; 输入整型 输出格式&#xff1a; 输出n行F字三角 样例 1 输入&#xff1a; 5输出&#xff1a; F FFF FFFFF FFFFFFF FFFFFFFFF 分析过程…

CSS:两列布局

两列布局是指一列宽度固定&#xff0c;另一列自适应。效果如下&#xff1a; HTML: <div class"container clearfix"><div class"left"></div><div class"right"></div> </div>公共 CSS&#xff1a; .con…

结构体的深入了解(下)

1.修改默认对齐数 在之前我们了解到在vs中的默认对齐数为8&#xff0c;在gcc下没有默认对齐数的&#xff0c;那我们能否在vs上进行修改呢&#xff1f;我们来试一下&#xff1a;&#xff08;#pragma 这个预处理指令&#xff0c;可以改变编译器的默认对齐数&#xff09; #includ…

信号系统之滤波详解

1 过滤的基础 通常希望使用信号的幅度&#xff0c;而不是它的功率。例如&#xff0c;假设一个增益为20dB的放大器。根据定义&#xff0c;这意味着信号中的功率增加了 100 倍。由于幅度与功率的平方根成正比&#xff0c;因此输出幅度是输入幅度的 10 倍。虽然 20dB 意味着功率的…

基于SSM的实习管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的实习管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

基于A-Star搜索算法的迷宫小游戏的设计

这篇文章是作者人工智能导论课的大作业&#xff0c;发出来供大家学习参考&#xff08;有完整代码&#xff09;。想要论文WORD文件的可以在本文资源处下载&#xff08;可能还在审核&#xff09;。 摘要&#xff1a; 本文章聚焦于基于A-Star搜索算法的迷宫小游戏设计&#xff0c;…

时序数据库Influxdb查询多个字段_field同一时间的值,组成一条数据

Influxdb将表格数据多个字段_field从垂直列布局聚合成水平布局行字段。 问题 1、Influxdb 是一种时间序列数据库&#xff0c;在我的项目中主要用来存储换热站的测点数据的。换热站有非常多的测点&#xff0c;我们用Flux 语法去查询测点数据&#xff0c;返回的数据结构是每个测…

[C++] 如何使用Visual Studio 2022 + QT6创建桌面应用

安装Visual Studio 2022和C环境 [Visual Studio] 基础教程 - Window10下如何安装VS 2022社区版_visual studio 2022 社区版-CSDN博客 安装QT6开源版 下载开源版本QT Try Qt | 开发应用程序和嵌入式系统 | Qt Open Source Development | Open Source License | Qt 下载完成&…

Linux 分析指定JAVA服务进程所占内存CPU详情

1、获取服务进程PID [rootVM-32-26-centos ~]# service be3Service status Application is running as root (UID 0). This is considered insecure. Running [25383]2、获取进程占用详情 [rootVM-32-26-centos ~]# cat /proc/25383/status Name: java Umask: 0022 State: S…

企业邮箱是什么?企业邮箱百科

本文将为大家讲解&#xff1a;1、企业邮箱的定义&#xff1b;2、企业邮箱的主要功能特点&#xff1b;3、企业邮箱如何选择和部署&#xff1b;4、企业邮箱的运营与维护&#xff1b;5、企业邮箱在实际工作中的应用与挑战&#xff1b;6、2024年最新五大企业邮箱盘点   下面提到的…

《计算机网络简易速速上手小册》第5章:无线网络和移动通信(2024 最新版)

5.1 WLAN的工作原理 - 揭秘无线局域网络的魔法 5.1.1 基础知识 无线局域网络&#xff08;WLAN&#xff09;允许设备通过无线方式连接到一个局部区域网络&#xff0c;主要基于IEEE 802.11标准&#xff0c;俗称Wi-Fi。WLAN的核心是无线路由器&#xff0c;它不仅充当着网络中各设…

记录一次centos 使用selenium运行环境

这里写自定义目录标题 宝塔面板 安装 selenium安装google-chrome 宝塔面板 安装 selenium 安装google-chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 查看chrome版本 google-chrome --version 下载对应chrome版本的chro…