linux---线程概念和线程控制

2023-05-16

1. 什么是线程
2. 线程和进程的关系
3. 线程的工作原理
4.线程和进程实现并发任务的优、缺
5. 线程控制

  1. 什么是线程
    在传统的操作系统中,进程就是一个pcb(进行运行中的程序的描述信息),控制程序的运行,但是在linux下没有为线程设计一个pcb来控制线程的运行,线程此时就是以进程pcb模拟实现的,也就是说,线程在linux下pcb实际上是一个线程,在linux下线程以进程pcb模拟实现,所以线程也叫轻量级进程。
    linux下的进程实际上是一个线程组,包含一个或者多个线程
  2. 线程和进程之间的关系
  • 因为cpu调度程序运行时调度pcb,因此线程是cpu调度基本单位
  • 因为一个程序运行起来就会分配大量的资源给线程组,因此进程是资源分配的基本单位
  1. 线程的工作原理
    我们都知道在进程中vfork()创建子进程与父进程公用同一个虚拟地址空间,因此我们的进程不能同时的去运行,那么线程公用同一个虚拟地址空间如何做到我们同时运行了?
    其实这个问题我们可以从问题上来解决,思考为什么vfork()不能同时运行呢,因为他是共用的同一个虚拟地址空间,但是我们在线程同可以将我们的进程需要的地址空间进行公有,但是我们线程自己独立使用的时候就需要私有化。
    多线程中线程与线程之间独有的数据
  • 栈区
    在虚拟地址空间中的栈区,在前面的知识中已经讲解了
  • 寄存器
    寄存器是线程独有的数据,也成为线程的上下文,主要是为了反映 了上次运行时寄存器的状态,这部分应该是线程独有的
  • errno
    错误码,独有数据,假设我们在一个线程中出现一个错误的时候我们的在其他线程中也会出现此errno,所以我们需要errno独有
  • 信号屏蔽字
    在每个线程中可能在代码中的逻辑会出现不一样的信号屏蔽集
  • 线程IO
    文件描述符,因为在一个线程中打开的文件在其他线程中应该是不能被使用的,所以我们的线程IO应该是独有的。
    同一个进程的线程共享的数据
  • 数据段和代码段
  • 文件描述符表
  • 信号处理方式
  • 用户ID,组ID
  • 当前的工作路径(不一定是程序路径)
  • 调度优先级
  1. 线程和进程实现并发任务的优、缺。
    在多线程和多进程中我们都可以完成并发任务,但是哪一个更好呢?
    其实两者是各有各的好处
    线程实现并发任务的优点
  • 线程通信更方便
  • 线程的创建、销毁成本更低
  • 同一个进程间的线程调度成本更低
  • 执行粒度更加细致(就是我们线程是最小的执行单位,一个进程是由一个或者多个线程组成的)
    线程实现并发任务的缺点
  • 缺乏访问控制,健壮性低(一些系统调用和异常针对整个进程产生的效果)

上述都是线程实现并发的优缺点(对应的就是我们进程的缺优点)
两者共同的优缺点:

  • 都可以并发或者并行执行任务,提高处理效率

共同的缺点:

  • 对临街资源操作需要更多的考虑,编码更加复杂

重点概念:
cpu密集程度:程序中都是大量的运行操作(需要cpu计算的多)
IO密集程序:程序中都是大量的IO操作

  1. 线程控制
    操作系统没有提供线程控制的接口,使用的时候是系统调用接口,在内核中有程序去创建线程
  • 线程的创建
       #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 phread_attr_t* attr:设置线程的属性
void*(start_routine)(void):是我们的线程入口函数
void* arg:是线程传递的参数
返回值:成功返回0,失败返回errno
理解线程id:每一个线程都是一个pcb,task_struct都有一个pid,但是用户使用ps命令的时候查看线程缺只有一个线程,也就是只有一个进程的进程pid
但是在task_struct中含有LWP,PID,TID,其中LWP是task_strcut指向的pid,就是我们的轻量级进程id,PID是task_struct中的tgid,也就是线程组中的中线程pid,就是我们常说的进程id。我们的线程也是含有线程信息的,在共享内存中有一块内存存储的描述信息,就是栈和数据等等,TID就是我们描述信息的内存首地址,也就是我们的线程id(pthread_t).

  • 线程终止
    线程终止就是线程在此程序中退出,其中退出的方式包含了主动和被动退出,
    主动退出:
    1. return退出,但是在线程入库函数中和主线程中是不一样的,在main中return是退出整个进程,在线程入库函数中是退出我们的该线程
       #include <pthread.h>
       void pthread_exit(void *retval);
       Compile and link with -pthread.

retval:线程退出返回值
注意:线程退出也会形成我们的僵尸线程,主线程退出进程并不会退出,因为线程退出也要保存自己的退出返回值,

被动退出

       #include <pthread.h>
       int pthread_cancel(pthread_t thread);
       Compile and link with -pthread.

这是退出我们指定的线程
thread_t thrad:就是我们制定的线程号

  • 线程等待
    线程等待:获取指定退出线程的返回值,并且允许操作系统回收线程资源
       #include <pthread.h>

       int pthread_join(pthread_t thread, void **retval);

       Compile and link with -pthread.

一个线程启动之后,默认有一个属性是线程joinable状态,处于joinable状态的线程退出时,不会自动释放资源,需要被等待,
在线程等待的时候就是回收我们线程并且获取退出原因,但是此时线程必须是处于joinable状态
pthread_t thread:回收的线程
void** retval:线程退出返回值
返回值:成功返回0,失败返回errno

  • 线程分离
    分离一个线程,在线程退出后系统将自动回收资源,被分离的线程无法被等待,若使用pthread_join进行回收直接报错返回,设置线程分离将从joinable状态变为detach状态
       #include <pthread.h>
       int pthread_detach(pthread_t thread);
       Compile and link with -pthread.

pthread_t thread:被设置的线程id
被设置后线程处于EINVAL状态,这个状态就是线程不能被等待,或者已经被其他线程分离。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux---线程概念和线程控制 的相关文章

  • C51_day5:串口通信UART

    3 1 串口基本认知 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 串行接口 xff08 Serial Interface xff09 是指
  • 哈希表/哈希冲突及解决方法(较全)

    哈希表的概念请参阅他人文章 xff0c 关于哈希冲突的解决这篇文章基本都整理到了 xff0c 还有几个常见的面试题 解决hash冲突的几种方法 前导 xff08 题外话 xff09 xff1a 一 开放定址法 xff08 闭散列 xff09
  • 关于构造函数,拷贝构造函数,析构函数的调用顺序(1)

    导言 对象是由 底层向上 开始构造的 xff0c 当建立一个对象时 xff0c 首先调用基类的构造函数 xff0c 然后调用下一个派生类的构造函数 xff0c 依次类推 xff0c 直至到达派生类次数最多的派生次数最多的类的构造函数为止 因
  • vector的内存释放

    xff11 vector内存分配机制 C 43 43 中vector的一个特点是 xff1a 内存空间只会增长 xff0c 不会减小 即为了支持快速的随机访问 xff0c vector容器的元素以连续方式存放 xff0c 每一个元素都挨着前
  • MFC多人在线聊天室

    我已经在我的资源里上传了这个聊天室的代码了 基于MFC的C 43 43 的select模型的TCP聊天室 采用select网络模型 xff0c 支持多人同时登陆 xff0c 功能有上线 下线 群聊 私聊 使用CjsonObject进行数据传
  • linux---进程间通信(ipc)之共享内存

    前面我们讲解了进程间通信之管道 xff0c 这段我们讲解我们的共享内存 共享内存是所有进程间通信方式最快的一种 内存共享模型就像下面的图一样 xff0c 就是将物理内存映射到我们进程的虚拟地址上 xff0c 我们就可以直接操作我们虚拟地址空
  • Effective C++总结

    explicit关键字 C 43 43 中的explicit关键字只能用于修饰只有一个参数或者是其他参数有默认值的类构造函数 它的作用是表明该构造函数是显式的 而非隐式的 跟它相对应的另一个关键字是implicit 意思是隐藏的 类构造函数
  • 计算机网络(5)TCP之重传机制

    重传机制 超时重传数据包丢失确认应答丢失 快速重传SACKD SACK例一 ACK 丢包例2 xff1a 网络延时 TCP 是通过序列号 确认应答 重发控制 连接管理以及窗口控制等机制实现可靠性传输的 TCP 实现可靠传输的方式之一 xff
  • 中断与回调

    1 xff0c 回调函数 回调函数的原理是使用函数指针实现类似 软中断 的概念 比如在上层的两个函数A和B xff0c 把自己的函数指针传给了C xff0c C通过调用A和B的函数指针达到 当做了什么 xff0c 通知上层来调用A或者B 的
  • CUDA 程序的优化(3) 任务划分

    4 3 1任务划分原则 首先 xff0c 需要将要处理的任务划分为几个连续的步骤 xff0c 并将其划分为CPU端程序和GPU端程序 划分时需要考虑的原则有 列出每个步骤的所有可以选择的算法 xff0c 并比较不同算法在效率和计算复杂度上的
  • C++ Matlab混合编程时“函数或变量 ‘matlabrc‘ 无法识别”

    在QT中调用Matlab初始化时 xff0c 出现了 函数或变量 matlabrc 无法识别 的情况 xff0c 接着崩溃 而且比较神奇的是 xff0c 前一次是可以初始化的 xff0c 但运行过程中发生了崩溃 直接搜解决办法 xff0c
  • Notepad++全选一整列的靠谱办法

    遇到行数较少的可以直接按住ALT手动选取 xff0c 但遇到行数较多 xff0c 就得这么干 xff1a 鼠标放在第一行某一列 xff0c 按住Alt 43 Shift xff0c 然后鼠标选择最后一行该列 xff0c 输入内容即可 xff
  • 对象转xml格式工具类

    import com ruiyun gui store haikang haikang bean FCSearchDescription import com ruiyun gui store haikang haikang bean FD
  • 【无标题】MQ静态图片获取

    public void getImageV40 String path Integer buildingProjectId HttpServletResponse response JSONObject param 61 new JSONO
  • 数据加解密时Base64异常:Illegal base64 character 3a

    现象 用base64工具类对中文进行处理时出现异常 xff0c 在数据加解密场景中经常使用 java lang IllegalArgumentException Illegal base64 character 3a at java uti
  • Winsock编程实例---TCP&UDP

    0x1 基于TCP的通信 1 服务端 1 1 创建基本流程 创建一个TCP服务端的程序需要调用的函数流程 xff1a 初始化函数库 gt gt WSAStartup 创建套接字 gt gt socket 绑定套接字 gt gt bind 监
  • 数据结构---选择排序(直接选择排序和堆排序图解)

    选择排序思想 xff1a 每一次从待排序的数据元素中选出最小 xff08 或最大 xff09 的一个元素 xff0c 存放在序列的起始位置 xff0c 直到全部待排序的 数据元素排完 直接选择排序 在元素集合array i array n
  • Java HttpUtils类

    Java HttpUtils类 Java HttpUtils类 定义 Public class HttpUtils 收集HTTP Servlet使用的静态的有效方法 方法 1 getRequestURL public static Stri
  • Ubuntu打造家用NAS三——网盘与影视中心

    Ubuntu打造家用NAS三 网盘与影视中心 一 Ubuntu 挂载硬盘 通过 Putty 连接 NAS查看硬盘位置 xff1a sudo fdisk l找到需要挂载的硬盘 xff0c 我的是 Disk dev sdb xff1a xxx
  • Ardupilot笔记:Rover auto模式下的执行流程

    先从mode auto cpp的update 开始分析 流程如图 xff1a 进入函数update 后会执行函数navigate to waypoint mode auto cpp span class token keyword void

随机推荐

  • 串口通信协议 UART+I2C+SPI

    UART 异步 串行 全双工 I2C SPI 不同通信协议比较 UART UART协议详解 UART通信 xff0c 接收与发送 xff08 详细版 xff0c 附代码 xff09 UART串行通信详解 待整理 UART是Universal
  • c语言---宏

    宏 1 仅仅替换 2 不能定义宏参类型 3 不会检查宏参有没有定义 定义带参数的宏 define JH a b t t 61 a a 61 b b 61 t xff0c 对两个参数a b的值进行交换 xff0c 下列表述中正确的是 xff0
  • Ros安装rosdep update出错,解决办法(从根本入手)

    博主作为一个ros刚入门的新手 xff0c 之前也安装过ros ros2但是在Ros安装在进行rosdep update 时运气与网络是成功的关键 xff0c 在尝试了好多次 xff0c 运气好一次就成功了 xff0c 运气不好得不停的试错
  • vscode使用方法

    01 ctrl 43 u 返回上一个光标焦点 02 发送请求插件 到VSCode插件中搜索REST Client 搜索到 xff0c 点击install进行安装 创建一个 http文件 编写测试接口文件 右键选择 发送请求 xff0c 测试
  • 自主飞行无人机开发--SALM cartographer开源框架 rplidar A2/3

    参考学习网站 xff1a https google cartographer ros readthedocs io en latest 问题提出 xff1a 四旋翼搭载激光雷达A3进行SLAM室内定位 xff0c 其怎样Running Ca
  • C#串口通信中的奇偶性校验、CRC校验函数

    一般来说 xff0c 通信协议中的通用数据格式是 包头 43 指令码 43 数据长度 43 有效数据 43 校验码 43 包尾 其中 xff0c 校验方式有多种 xff0c 最流行的是CRC校验方式 xff0c 其次是简单的奇偶性校验 校验
  • 测试软件安装步骤

    目录 Ja 目录 Java安装 jdk下载 jdk环境配置 phpstudy安装 禅道的安装 xampp安装 postman安装 requests parameterized jmeter安装 JVM监控 Locust SecureCRT软
  • linux---进程信号

    进程的功能以及概念信号的生命周期以及相关的接口自定义信号的捕捉流程信号集以及阻塞信号集了解一个SIGCHLD信号 信号的功能以及概念 信号的功能 xff1a 信号就是通知我们某一个事件的发生 信号的概念 xff1a 信号就是一个软件中断 x
  • 双目立体视觉:四(双目标定matlab,图像校正,图像匹配,计算视差,disparity详解,)

    二郎也比较忙 xff0c 在某大场工作 xff0c 有时候没有时间回复 如果希望二郎尽快帮忙 xff0c 可以将代码 xff0c 数据和问题发给二郎 xff0c 谢谢大家理解 glwang20 64 mails jlu edu cn 不过还
  • conda解决 An HTTP error occurred when trying to retrieve this URL.问题

    遇到 xff1a Collecting package metadata current repodata json failed CondaHTTPError HTTP 000 CONNECTION FAILED for url lt h
  • ubuntu20.04 安装 WPS 2019

    ubuntu自带的文字处理软件对来自windows下office或在WPS创建的ppt有点不兼容 xff0c 看到WPS有linux版本的 xff0c 便果断安装试一试 一 卸载原生liboffice sudo apt get remove
  • 制作ubuntu系统的 usb启动盘

    前言 由于课程的要求 xff0c 要尝试完成 编译安装Linux系统的内核 xff0c 但是在编译内核的过程中 xff0c Ubuntu的grub引导好像出了一些问题 xff0c 不能进入系统了 所以就要制作一个usb启动盘 xff0c 看
  • 项目用到的开源库>http-parser(一个HTTP消息解析器)

    http parser 定义 xff1a 一个用C编写的HTTP消息解析器 xff0c 可以解析请求和响应 优点 xff1a 不会进行任何系统调用及内存分配 xff0c 它不会缓冲数据 xff0c 它可以被随时中断 根据你的体系结构 xff
  • 项目优化>C++,concurrentqueue(高性能并发队列)

    项目中的数据队列基于轮询和selep的实时性及CUP性能差 xff0c 需要进行优化 xff0c 尝试使用concurrentqueue进行优化 网上有一些资料介绍 可供参考 使用后的个人理解 一个线程安全的queue xff0c 并且co
  • shell>sed (对文件的内容进行替换)

    在生产环境中经常会遇到对配置文件的修改 xff0c 那写成一个脚本 xff0c 传个参数修改配置文件不就方便多了吗 对一个文件的操作那我暂且分为增删改查了 写在前面 i 这个参数很重要 xff0c 若需要更改源文件 xff0c 请配合 i参
  • Linux>软链接的作用与使用

    软链接 xff1a 为某一个文件在另外一个位置建立一个同不的链接 类似于Windows下的快捷方式 好处 xff1a 仅仅是个链接 xff0c 不占用空间 xff0c 使用还是照常使用 实际生产环境中 xff0c 使用第三方的工具 xff0
  • WPF--->自定义控件中添加按钮,TextBox添加Button为例

    span class token tag span class token tag span class token punctuation lt span Style span span class token attr name spa
  • STM32F767--->串口通信接收不定长数据的处理方法

    文章目录 写在前面超时中断相关寄存器接收器超时寄存器 USARTx RTOR 空闲中断整体思路 附录程序代码参考 写在前面 使用STM32F767有两种中断方式 超时中断和空闲中断 接不定长的数据 xff0c 其中超时中断要比空闲中断好用
  • STM32F7--->串口相关,串口的所有寄存器详讲

    文章目录 串口相关寄存器串口控制寄存器CR1CR2CR3 波特率寄存器 BRR保护时间和预分频寄存器 GTPR接收超时寄存器 RTOR请求寄存器 RQR中断和状态寄存器 ISR中断标志清零寄存器 ICR接收数据寄存器 RDR发送数据寄存器
  • linux---线程概念和线程控制

    1 什么是线程 2 线程和进程的关系 3 线程的工作原理 4 线程和进程实现并发任务的优 缺 5 线程控制 什么是线程 在传统的操作系统中 xff0c 进程就是一个pcb xff08 进行运行中的程序的描述信息 xff09 xff0c 控制