Linux 线程的概念与实现方式

news2024/9/25 5:22:38

一、线程的概念

线程是进程内部的一条执行序列或执行路径,一个进程可以包含多条线程。

在这里插入图片描述

一个进程中有两条或多条执行路径的时候,它们是可以同时执行的,也就是说,一个进程中的多个线程是可以同时执行的。当我们需要一个程序同时执行两个不同操作的时候就引入了多线程。如果是一个单线程,只有一条路径时,不可能同时执行两个不同操作,因为其中一个操作正在执行的时候,另一个操作是阻塞状态。

当一个进程有一个主线程和一个子线程的时候,主线程和子线程可以同时执行;也可以有多个相同的子线程,这样就是一个主线程和多个子线程同时执行,多个子线程做的事情是一样的;也可以有多个不同的子线程,这样就是一个主线程和多个不同的子线程同时执行,多个子线程做的事情不一样。

二、线程的实现方式

在操作系统中,线程的实现有以下三种方式:

1.内核级线程
2.用户级线程
3.组合级线程

在这里插入图片描述

Linux 中线程的实现:
Linux 实现线程的机制非常独特。从内核的角度来说,它并没有线程这个概念。Linux把所有的线程都当做进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有唯
一隶属于自己的task_struct,所以在内核中,它看起来就像是一个普通的进程(只是线程和其他一些进程共享某些资源,如地址空间)。

三、进程与线程的区别

1.进程:一个正在运行的程序

进程是资源分配的最小单位;
进程有自己的独立地址空间;
进程的创建消耗资源大;
进程的切换开销大。

2.线程:是进程内部的一条执行序列或执行路径

线程是CPU调度的最小单位;
线程共享进程中的地址空间;
线程的创建相对较小;
线程的切换开销相对较小。

四、一个简单的多线程程序

1.创建线程的函数pthread_create:

在这里插入图片描述

使用pthread_create函数需要引用头文件pthread.h。由于pthread_create在线程库中,所以在编译程序的时候要链接pthread。

参数解释:

第一个参数thread:事先创建好的pthread_t类型的参数。成功时thread指向的内存单元被设置为新创建线程的线程ID。
第二个参数attr:用于定制各种不同的线程属性。通常直接设为NULL。
第三个参数start_routine:新创建线程从此函数开始运行。
第四个参数arg:start_routine函数的参数。无参数时设为NULL即可。有参数时输入参数的地址。当多于一个参数时应当使用结构体传入。
返回值:成功返回0,否则返回错误码。

2.编写一个简单的多线程程序

代码如下:

在这里插入图片描述

运行结果:

在这里插入图片描述

出现这样的运行结果是因为主函数直接就运行完了,直接5次循环就结束了,线程函数还没有来得及输出,因为主函数退出之后系统会自动调用exit来退出整个进程,相当于直接把当前进程结束了,不管有多少条执行路径都随之退出了。

由于以上代码的执行结果并不理想,主线程和子线程好像并没有同时运行,修改以上代码,如下图所示:

在这里插入图片描述

在主线程和子线程每次输出数据之后都睡眠1秒,这时就可以看到,两个进程是同时执行的,至于执行的顺序没有固定顺序,运行结果如下图:

在这里插入图片描述

pthread_join 方法

这个方法是当主线程执行完之后不退出进程,而是等待子线程执行,等子线程执行完之后系统才会调用exit来退出进程。

将代码修改如下:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

由结果可以看出,主线程和子线程同时执行。

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

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

相关文章

【LeetCode-简单题】49. 字母异位词分组

题目 题解一:排序哈希表 思路:由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。 核心api: //将字符串转换为字符数组char[] ch str.toCharArray();…

飞机打方块(二)游戏界面制作

一、背景 1.新建bg节点 二、飞机节点功能实现 1.移动 1.新建plane节点 2.新建脚本GameController.ts,并绑定Canvas GameControll.ts const { ccclass, property } cc._decorator;ccclass export default class NewClass extends cc.Component {property(cc.Node)canvas:…

详解strcmp函数

strcmp函数是用来比较两个字符串的,按理来说,比较结果只有两种:相同或不同。但是,事实上,strcmp函数在设计时会有三种情况,下面详细介绍: 这个函数的输入为两个字符串的首元素地址(即…

Hlang--用Python写个编程语言-逻辑运算

文章目录 前言关键词解析token解析器解释器语法表示前言 在上一篇文章里面,实现了基本的变量,并且详细地阐述了基本原理,所以的话,这里要实现的就是这个判断,由于架子基本上打好了,后面的操作无法就是确定这个AST的一个执行顺序,也就是我们希望解释器执行的一个情况。 …

OpenCV基础知识(5)— 几何变换

前言:Hello大家好,我是小哥谈。OpenCV中的几何变换是指改变图像的几何结构,例如大小、角度和形状等,让图像呈现出缩放、翻转、旋转和透视效果。这些几何变换操作都涉及复杂、精密的计算。OpenCV将这些计算过程都封装成了非常灵活的…

8. 实现业务功能--用户注册

目录 1. 顺序图 2. 参数要求 3. 接口规范 4. 创建扩展 Mapper.xml 5. 修改 DAO 6. 创建 Service 接口 7. 实现接口 8. 测试接口 9. 实现 Controller 9.1 密码加密处理 10. 实现前端界面 业务实现过程中主要的包和目录及主要功能: model 包:实体对象 d…

一文带你了解G1收集器:全功能的垃圾收集器

(笔记参考书籍:《JVM高级特性与最佳实践》) 一、介绍 Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。 G1…

【Lua】(一)VSCode 搭建 Lua 开发环境

前言 最近在找工作,基本所有的岗位都会问到 Lua(甚至拼 UI 的都要求会 Lua),咱能怎么办呢,咱也只能学啊…… 工欲善其事,必先利其器。第一步,先来把环境配置好吧! 当前适用版本&a…

【玩转Linux操作】crond的基本操作

🎊专栏【玩转Linux操作】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题🥰 文章目录 🍔概述🍔命令⭐常用选项 🍔练…

如何解决由于找不到msvcp120.dll无法继续执行代码的问题

在使用电脑的过程中,突然遭遇到了一个让我犯愁的问题——缺少了msvcp120.dll文件。这个文件是系统中的一个重要组件,它的丢失导致了一些应用程序无法正常运行。面对这个困扰,我决定展开一场寻找和修复的心旅程。起初,我并不知道ms…

ONLYOFFICE协作空间服务器如何一键安装自托管私有化部署

ONLYOFFICE协作空间服务器如何一键安装自托管私有化部署 如何在 Ubuntu 上部署 ONLYOFFICE 协作空间社区版?https://blog.csdn.net/m0_68274698/article/details/132069372?ops_request_misc&request_id&biz_id102&utm_termonlyoffice%20%E5%8D%8F%E4…

leetcode:1668. 最大重复子字符串(python3解法)

难度:简单 给你一个字符串 sequence ,如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word 的 重复值为 k 。单词 word 的 最大重复值 是单词 word 在 sequence 中最大的重复值。如果 word 不是 sequence 的…

GIF文件解析

Java & Swing实现对GIF图像的解析和显示。 有三部分内容: 1 是gif文件解析; 2 是 图像数据解码; 3 是GUI端显示;仅贴出第2部分图像数据解码, 解码也有三部分,1 是基于位的code获取; 2是字典…

CVE-2015-5254漏洞复现

1.漏洞介绍。 Apache ActiveMQ 是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持 Java 消息服务,集群,Spring Framework 等。Apache ActiveMQ 5.13.0之前 5.x 版本中存在安全漏洞,该漏…

SpringBoot 学习(03): 弱语言的注解和SpringBoot注解的异同

弱语言代表:Hyperf,一个基于 PHP Swoole 扩展的常驻内存框架 注解概念的举例说明; 说白了就是,你当领导,破烂事让秘书帮你去安排,你只需要批注一下,例如下周要举办一场活动,秘书将方…

步步向前,曙光已现:百度的大模型之路

大模型,是今年全球科技界最火热,最耀眼的关键词。在几个月的狂飙突进中,全球主要科技公司纷纷加入了大模型领域。中国AI产业更是开启了被戏称为“百模大战”的盛况。 但喧嚣与热闹之后,新的问题也随之而来:大模型的力量…

[虚幻引擎] UE使用虚拟纹理在模型上显示挖空效果

此教程是记录如在UE中使用虚拟纹理,实现模型挖洞的效果。 1. 新建项目,开启项目支持虚拟纹理并并重启。 2. 新建一个基础关卡 3. 拖动“运行时虚拟纹理体积” 进入场景,并把体积修改变大,以可以完全包括到地板。 4. 创建一个虚拟纹…

08-微信小程序视图层

08-微信小程序视图层 文章目录 视图层 ViewWXML数据绑定列表渲染条件渲染模板引用importimport 的作用域include WXSS尺寸单位样式导入内联样式选择器全局样式与局部样式 WXS注意事项页面渲染数据处理 视图层 View 框架的视图层由 WXML 与 WXSS 编写,由组件来进行…

使用Scikit-Learn实现多标签分类,助力机器学习

大家好,在机器学习任务中,分类是一种监督学习方法,用于根据输入数据预测标签。例如,我们想要根据历史特征预测某人是否对销售优惠感兴趣,通过使用可用的训练数据训练机器学习模型,可以对输入数据执行分类任…

【手写数据库toadb 造不一样的轮子】行列混合存储模型 就是为大模型分析准备的

行列混合存储模型 ​专栏内容: postgresql内核源码分析手写数据库toadb并发编程个人主页:我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 概述 混合模型的由来 我们虽然造轮子,但是也会造完全一样的轮子。所以toadb在选择存储模型时,行存模型已经成熟…