以Linux为例了解线程

在这里插入图片描述

  • 我最近开了几个专栏,诚信互三!
    ====> |||《算法专栏》::刷题教程来自网站《代码随想录》。|||
    ====> |||《C++专栏》::记录我学习C++的经历,看完你一定会有收获。|||
    ====> |||《Linux专栏》::记录我学习Linux的经历,看完你一定会有收获。|||
    ====> |||《C#专栏》::记录我复习C#的经历,深度理解查漏补缺,不定期更新。|||
    ====> |||《计算机网络专栏》::记录我学习计算机网络,看完你一定会有收获。|||

以Linux为例了解线程

  • 什么是线程
  • 为什么要有线程
    • Linux下的“线程”
    • 线程结构
    • 线程的优缺点
  • 线程创建
  • 线程退出
  • 线程等待

什么是线程

线程是进程的一个执行分枝线程是CPU调度与执行的基本单位
而我们之前学过的进程,则是OS资源分配的基本单位。
进程与线程之间的关系如下图。
在这里插入图片描述
在一个进程内,每个线程的大多数资源都是共享的,但是也又一些资源并非共享,我们下面会介绍。

为什么要有线程

CPU要完成并发,我们之前是使用多进程,多进程需要开辟多个进程地址空间,这样对内存的开销很大,并且多进程对cache的利用率不高,导致多进程的调度效率不如多线程

Linux下的“线程”

在Linux操作系统下,是没有线程概念的,但存在一个轻量级进程(LWP)的概念,而实现Linux下的线程则是在Linux原生库中,并且分装了LWP,所以Linux中线程也被称为用户级线程
并且Linux下的进程也是分装了LWP的,所以Linux下进程和线程的根源都是LWP。
在这里插入图片描述

线程结构

由于Linux下的线程不属于系统库,所以操作系统不会对线程进行管理,实际上,Linux下对于线程的管理是由原生线程库完成的。
以下为线程结构体结构。
在这里插入图片描述
1).每个线程都拥有单独的栈空间,主线程的栈空间就是地址空间中的栈,而其他线程的栈空间则是自带的。
2).线程还存在一个线程局部存储区域,该区域可以将多线程的共享资源,拷贝一份到线程局部存储区域内,(__thread)作为线程的单独资源来使用,只能拷贝C语言的内置类型。
3).属性信息则是记录线程的属性,比如该线程是否分离等等。

在Linux中使用线程时,我们一定要链接原生线程库,此时每个进程创建的线程都会被组织在库中,如下图。
在这里插入图片描述
可以看到,在线程库内,线程类似与数组一样被组织起来。

线程的优缺点

现在我们可以总结一下线程的优缺点,我们类比进程。
优点:

1).用多线程实现并发比多进程要更加节省空间。
2).多线程CPU的调度速度,比多进程调度速度更快。
3).多线程对计算密集型IO密集型的程序效率更高。

缺点:

1).线程没有访问控制,多线程中,先运行那个线程,是不确定的。
2).大量线程会导致CPU运行效率降低。
3).多线程代码会使得代码健壮性降低。

多线程的绝大部分资源都是共享的,但是也有部分资源不共享。

1).每个线程都有自己的栈空间。
2).线程是CPU调度与执行的基本单位,所以每个线程都有自己的一组寄存器。

同时也有很多资源是共享的,其中比较容易记混的。

1).所以线程都共有一个文件描述数组,及文件描述数组是进程独有的资源。
2).地址空间都是线程共有的。

线程创建

线程创建的接口如下

pthread_create
在这里插入图片描述

参数1:thread是一个线程的id,用于在用户层标示一个唯一的线程,它是一个输出型参数,只需要传入,由线程创建接口返回该值。
参数2:是创建线程时可以赋予其属性,传入NULL即可。
参数3:是线程对应执行的方法,函数指针类型。
参数4:是线程执行方法的参数。
返回值代表成功与否。
在这里插入图片描述
要注意的是,创建出的线程函数的参数和返回值都是void * 类型, 这是因为void类型无法定义变量,而void * 类型任何类型的指针都可以接收和返回
线程的tid实际上,是一个虚拟地址
在这里插入图片描述
Linux中线程的维护是通过线程库进行的,线程库是动态库,线程要加载动态库到进程地址空间上,这样线程库内的所有资源都有了虚拟地址,每个线程的tid其实就是tcb的虚拟地址

线程退出

在新线程内,可以使用return 退出新线程,但是对于主线程,它和进程捆绑,所以主线程return 就代表进程退出,而原生线程库提供了一些线程退出的接口。

pthread_exit
在这里插入图片描述

参数1:retval代表新线程要返回的值,该接口可以代替return。
在这里插入图片描述

我们也可以在其他线程内让某个线程退出。

pthread_cancel
在这里插入图片描述

参数1:接收一个线程的tid,将线程取消,要注意,该接口不止能在主线程内取消其他线程,在其他线程内,乃至自己本身都能取消自己。
在这里插入图片描述

同时也可以自己退出自己

但我们还需要使用一个接口获得自己的tid。
pthread_self
在这里插入图片描述
直接使用,获得当前线程的tid。
在这里插入图片描述

线程等待

如同进程一样,主线程也需要阻塞等待新线程,同时回收新线程的资源。

pthread_join
在这里插入图片描述

参数1:代表主线程要等待那个线程。
参数2:是一个输出型参数,接收新线程的返回值。
在这里插入图片描述

主线程对其他线程需要进行阻塞等待,如果对线程的返回值无要求,那么我们可以将某个线程设置为分离,这样在该线程退出时,主线程就无需阻塞等待回收结果了。

pthread_detach
在这里插入图片描述

参数1:某个线程的tid,对某个线程进行分离,可以在线程内对自己分离,但是建议在主线程内对某些线程进行分离
同时我们被分离的线程,我们不用对线程进行等待,也不能对线程进行等待。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IO系列(八) -浅析NIO工作原理

一、简介 现在使用 NIO 的场景越来越多,很多网上的技术框架或多或少的使用 NIO 技术,譬如 Tomcat、Jetty、Netty,学习和掌握 NIO 技术已经不是一个 Java 攻城狮的加分技能,而是一个必备技能。 那什么是 NIO 呢? NIO…

第06章 数据加载、存储与文件格式

以下内容参考自https://github.com/iamseancheney/python_for_data_analysis_2nd_chinese_version/blob/master/%E7%AC%AC05%E7%AB%A0%20pandas%E5%85%A5%E9%97%A8.md 《利用Python进行数据分析第2版》 用以学习和记录。 输入输出通常可以划分为几个大类:读取文本文…

深海奥秘:鳐鱼肽的肌肤之旅

深海,一个神秘又充满生命力的世界,总是带给我们无尽的惊喜。鳐鱼,又被称为“魔鬼鱼”,它的皮肤中含有一种特殊的肽,这种肽不仅分子量适中,易于人体吸收,还具有极高的消化率和生物利用度。来自北…

科技引领乡村振兴新潮流:运用现代信息技术手段,提升农业生产和乡村管理效率,打造智慧化、现代化的美丽乡村

一、引言 随着科技的不断进步,现代信息技术已经渗透到社会的各个领域,成为推动社会发展的重要力量。在乡村振兴战略的背景下,科技的力量同样不容忽视。本文旨在探讨如何运用现代信息技术手段,提升农业生产和乡村管理效率&#xf…

Android软件渲染流程

Android软件渲染流程 一.渲染流程1.VSync信号的监听2.VSync信号触发绘制 二.渲染原理1.画布的获取1.1 渲染缓存的初始化1.2 graphics::Canvas的创建1.3 graphics::Canvas与渲染缓存的绑定1.3.1 SkBitmap的初始化1.3.2 SkiaCanvas与SkBitmap的绑定1.3.3 SkCanvas的创建 2.矩形的…

Transformer系列专题(二)——multi-headed多头注意力机制

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、什么是multi-headed(多头注意力机制)二、multi-headed三、multi-headed结果四、堆叠多层总结 前言 在实践中,当给定相同…

【数据库基础】基本认识数据库--入门引导

文章目录 什么是数据库?主流数据库基本使用安装MySQL连接服务器服务器、数据库、表关系使用案例数据逻辑存储 MySQL架构SQL语句分类什么叫存储引擎 什么是数据库? 数据库是指在磁盘和内存中存储特定结构组织的数据。数据库通常用于存储于某个系统、组织或…

分布式异步框架celery + Redis 安装配置

引入 这里不对web框架做过多说明,到时候在总结一篇 python的常见web框架 django、flask、tornado、sanic、fastapi..各框架区别 - 内部集成功能的多少 django,内部提供了很多组件。 【相对大】flask、tornado、sanic、fastapi… 本身自己功能很少第…

Linux c开发线程锁和条件变量使用

#include <pthread.h> #include <stdio.h> #include <unistd.h>pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond PTHREAD_COND_INITIALIZER;void* thread_function(void* arg) {printf("线程等待唤醒,锁定互斥量...\n");…

【Unitydemo制作】音游制作—排行榜逻辑Json存储

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

查看当前Shell系统环境变量

查看当前Shell系统环境变量 查看命令 env效果 查看Shell变量(系统环境变量自定义变量函数) 命令 set效果 常用系统环境变量 变量名称含义PATH与windows环境变量PATH功能一样&#xff0c;设置命令的搜索路径&#xff0c;以冒号为分割HOME当前用户主目录&#xff1a;/rootSH…

day08-Java常用API

day08——Java常用API 一、今日内容介绍、API概述 各位同学&#xff0c;我们前面已经学习了面向对象编程&#xff0c;使用面向编程这个套路&#xff0c;我们需要自己写类&#xff0c;然后创建对象来解决问题。但是在以后的实际开发中&#xff0c;更多的时候&#xff0c;我们是…

通过 Spring 操作 Redis

要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 创建项⽬ 勾选 NoSQL 中的 Spring Data Redis 当然, 把 Web 中的 Spring Web 也勾选⼀下.⽅便写接进⾏后续测试. 配置 redis 服务地址 在 application.…

数据库的约束 not null, unique, default, primary key, foreign key, check

约束可以理解成 数据库提供的一种针对数据的合法性进行验证的机制, 在创建表的时候使用 1. 约束类型 NOT NULL - 指示某列不能存储 NULL 值, 表里的这个内容是必填项UNIQUE - 保证某列的每行必须有唯一的值, 不能重复 每次插入/修改时, 都要先触发查询, 如果当前插入/修改的…

mysql存储比特位

一、介绍 二、SQL CREATE TABLE bits_table (id INT PRIMARY KEY AUTO_INCREMENT,bit_value BIGINT UNSIGNED );-- 插入一个 8 位的 BIT 值 INSERT INTO bits_table (bit_value) VALUES (B10101010);-- 查询并格式化输出 SELECT id,bit_value,CONCAT(b, LPAD(BIN(bit_value),…

解决小皮面版搭建php网站数据库连接不了

首先进入mysql bin目录下 并执行cmd mysql -u root -pCREATE USER userlocalhost IDENTIFIED BY pass;GRANT ALL PRIVILEGES ON *.* TO userlocalhost;GRANT SELECT, INSERT, UPDATE ON database_name.* TO xxwlocalhost;FLUSH PRIVILEGES;select host ,user from mysql.user…

pdf文件怎么编辑?分享3个专业的pdf软件!

在数字化时代&#xff0c;PDF文件已成为我们工作、学习中的得力助手。然而&#xff0c;面对需要修改的PDF文件&#xff0c;许多人却感到无从下手。今天&#xff0c;就让我们一起探索如何轻松编辑PDF文件&#xff0c;并介绍几款实用的编辑软件&#xff0c;让你轻松应对各种PDF编…

Linux DAY 6 _systemctl

systemctl命令&#xff0c;通过这个命令控制系统操作 语法&#xff1a;systemctl start | stop | status | enable | disable 服务名 start 启动 stop 关闭 status 查看状态 enable 开启开机自启 disable 关闭开机自启 服务名&#xff1a; NetworkManager 主网络服务 net…

DFE_offset失调校准

1.校准原因 *制造工艺的限制&#xff1a;晶体管在制造过程中&#xff0c;由于工艺的限制&#xff0c;不可能做到完全对称&#xff0c;这导致了输入级晶体管的性能存在微小的差异。 *输入级偏置电流的不对称&#xff1a;输入级晶体管的偏置电流也会存在差异&#xff0c;这也会…

如何在OpenHarmony上使用SeetaFace2人脸识别库?

简介 相信大部分同学们都已了解或接触过OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;了&#xff0c;但你一定没在OpenHarmony上实现过人脸识别功能&#xff0c;跟着本文带你快速在OpenHarmony标准设备上基于SeetaFace2和OpenCV实现人脸识别。 项目效…