当前位置: 首页 > news >正文

【Linux线程】第一章||理解线程概念+创建一个线程(附代码加讲解)

线程概念

  • 🌵什么是线程
    • 🌲线程和进程的关系
    • 🎄线程有以下特点:
    • 🌳 线程的优点
    • 🌴 线程的缺点
    • 🌱线程异常
    • 🌿线程用途
  • ☘️手动创建一个进程
    • 🍀运行

🌵什么是线程

在Linux下,线程是进程的一部分,是可以独立执行的轻量级执行单元。每个进程都至少有一个线程,这个线程称为主线程或主进程。进程可以创建多个线程,这些线程共享进程的资源,包括内存空间、文件描述符等。不同线程之间可以并发执行,共享进程的全局变量和静态变量,从而实现多任务并发执行的效果。

🌲线程和进程的关系

线程和进程是操作系统中两种并发执行的基本单位,它们之间有着密切的关系。简单来说,一个进程可以包含多个线程,而线程是进程的执行单元。

具体来说,进程是一个独立的执行环境,有自己的地址空间、代码、数据和系统资源,它是操作系统分配资源和进行资源调度的基本单位。一个进程可以包含一个或多个线程,这些线程共享进程的资源,包括内存空间、文件描述符等。因为线程共享进程的资源,所以线程之间的切换和创建比进程要快,也更加高效。

线程是进程的实际执行体,是CPU调度和执行的基本单位。一个进程中的多个线程可以并发执行,它们共享进程的资源,但每个线程都有自己的执行栈和程序计数器。因为线程共享进程的资源,所以线程之间可以更方便地进行通信和数据共享,而不需要像进程那样使用特殊的IPC(进程间通信)机制。

线程和进程的关系可以用类比来理解:一个进程就像是一栋大楼,而线程就是这栋大楼里的工人。大楼代表整个程序的执行环境,而工人代表实际执行任务的执行体。一个大楼里可以有多个工人,它们共享大楼的资源,可以协同合作完成任务。

总结来说,线程是进程的一部分,一个进程可以包含多个线程,线程共享进程的资源,可以并发执行,从而提高了程序的并发性和执行效率。线程的使用可以更充分地发挥多核CPU的性能,并实现更加高效的多任务处理

🎄线程有以下特点:

  1. 轻量级:相较于进程,线程创建、切换和销毁的开销较小,因为它们共享进程的资源。
  2. 共享资源:线程共享进程的内存空间和文件描述符等资源,因此可以直接访问进程的全局变量和静态变量。
  3. 并发执行:不同线程可以并发执行,提高了系统的资源利用率和响应速度。

在Linux系统中,线程由pthread库(POSIX线程库)提供支持。通过pthread库,可以创建、管理和同步线程。线程的创建和管理由程序员自己控制,可以根据需要创建多个线程来完成不同的任务,从而实现多线程编程。同时,线程间的同步也可以通过pthread库提供的互斥锁、条件变量等机制来实现,以防止多个线程同时访问共享资源时产生的竞争问题

下面是一多线程的结构图,CPU调度进程的时候,发现该进程有多个线程,可以执行不同的事务,对比单线程的进程,CPU可以减少进程的切换,从而提升效率。举个不是特别恰当的例子:CPU 好比外卖员,执行的调度任务好比外卖,一个多线程的进程就好比一栋小区(进程),里面有很多住户(线程),而单线程的进程就好比是一间独栋住宅,外卖员送进小区的外卖效率比较高,因为住户(线程)都在一个小区里面,而送独栋住宅的效率会低一些,因为切换的时间比较长…

00

单线程的进程 只有一个task_struct:
00

🌳 线程的优点

  • 创建一个新线程的代价要比创建一个新进程小得多
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
  • 线程占用的资源要比进程少很多
  • 能充分利用多处理器的可并行数量
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
  • I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

🌴 线程的缺点

  • 性能损失
  1. 一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型
  2. 线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的
  3. 同步和调度开销,而可用的资源不变。
  • 健壮性降低
  1. 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了
  2. 不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
  • 缺乏访问控制
    进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
  • 编程难度提高
    编写与调试一个多线程程序比单线程程序困难得多

🌱线程异常

单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出

🌿线程用途

合理的使用多线程,能提高CPU密集型程序的执行效率
合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)

☘️手动创建一个进程

  • 代码 Mytread.cpp
#include <iostream>
#include <string>
#include <unistd.h>#include <pthread.h>using namespace std;void *callback1(void *args)
{string name = (char *)args;while (true){cout << name << ": " << ::getpid() << endl;sleep(1);}
}void *callback2(void *args)
{string name = (char *)args;while (true){cout << name << ": " << ::getpid() << endl;sleep(1);}
}int main(){pthread_t tid1;pthread_t tid2;//创建线程pthread_create(&tid1, nullptr, callback1, (void *)"thread 1");pthread_create(&tid2, nullptr, callback2, (void *)"thread 2");while (true){cout << "我是主线程...: " << ::getpid() << endl;sleep(1);}//加入队列pthread_join(tid1, nullptr);pthread_join(tid2, nullptr);return 0 ;}

在主函数中,我们创建了两个线程 tid1 和 tid2,分别调用 pthread_create 函数,将回调函数 callback1 和 callback2 作为线程函数,并传递相应的线程名作为参数。接着,主线程进入一个无限循环,在循环中输出主线程的进程 ID。最后,使用 pthread_join 函数等待两个线程结束,确保它们执行完毕。

这段代码的作用是创建两个线程,并分别在每个线程中输出线程名和线程的进程 ID,同时主线程也在输出自己的进程 ID。因为每个线程都在不断地输出,所以你将会看到多个线程同时输出信息,直到程序手动终止。

  • Makefile
test:Mytread.cppg++ -Wall -o test Mytread.cpp -lpthread -std=c++11
.PHONY:clean
clean:rm -f test

注意加上 -lpthread

🍀运行

66
打开监控脚本看看:ps -aL
00
发现 只有一个PID,有三个LWP(Lightweight Process)是指轻量级进程。也就是线程…0
~本篇完结

🎍  🎋 🍃 🍂 🍁 🍄 🐚 💐 🌷 🌹 🥀 🌺 🌸 🌼 🌻

相关文章:

【Linux线程】第一章||理解线程概念+创建一个线程(附代码加讲解)

线程概念 &#x1f335;什么是线程&#x1f332;线程和进程的关系&#x1f384;线程有以下特点&#xff1a;&#x1f333; 线程的优点&#x1f334; 线程的缺点&#x1f331;线程异常&#x1f33f;线程用途 ☘️手动创建一个进程&#x1f340;运行 &#x1f335;什么是线程 在L…...

Android进阶之微信扫码登录

遇到新需求要搭建微信扫码登录功能,这篇文章是随着我的编码过程一并写的,希望能够帮助有需求的人和以后再次用到此功能的自己。 首先想到的就是百度各种文章,当然去开发者平台申请AppID和密钥是必不可少的,等注册好发现需要创建应用以及审核(要官网,流程图及其他信息),想着先写…...

macOS Monterey 12.6.8 (21G725) Boot ISO 原版可引导镜像

macOS Monterey 12.6.8 (21G725) Boot ISO 原版可引导镜像 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Lin…...

Unity自定义后处理——用偏导数求图片颜色边缘

大家好&#xff0c;我是阿赵。   继续介绍屏幕后处理效果的做法。这次介绍一下用偏导数求图形边缘的技术。 一、原理介绍 先来看例子吧。   这个例子看起来好像是要给模型描边。之前其实也介绍过很多描边的方法&#xff0c;比如沿着法线方向放大模型&#xff0c;或者用Ndo…...

本地Git仓库和GitHub仓库SSH传输

SSH创建命令解释 ssh-keygen 用于创建密钥的程序 -m PEM 将密钥的格式设为 PEM -t rsa 要创建的密钥类型&#xff0c;本例中为 RSA 格式 -b 4096 密钥的位数&#xff0c;本例中为 4096 -C “azureusermyserver” 追加到公钥文件末尾以便于识别的注释。 通常以电子邮件地址…...

【C++11】——右值引用、移动语义

目录 1. 基本概念 1.1 左值与左值引用 1.2 右值和右值引用 1.3 左值引用与右值引用 2. 右值引用实用场景和意义 2.1 左值引用的使用场景 2.2 左值引用的短板 2.3 右值引用和移动语义 2.3.1 移动构造 2.3.2 移动赋值 2.3.3 编译器做的优化 2.3.4 总结 2.4 右值引用…...

消息服务概述

消息服务的作用&#xff1a; 在多数应用尤其是分布式系统中&#xff0c;消息服务是不可或缺的重要部分&#xff0c;它使用起来比较简单&#xff0c;同时解决了不少难题&#xff0c;例如异步处理、应用解耦、流量削锋、分布式事务管理等&#xff0c;使用消息服务可以实现一个高…...

【Spring Boot】Web开发 — 数据验证

Web开发 — 数据验证 对于应用系统而言&#xff0c;任何客户端传入的数据都不是绝对安全有效的&#xff0c;这就要求我们在服务端接收到数据时也对数据的有效性进行验证&#xff0c;以确保传入的数据安全正确。接下来介绍Spring Boot是如何实现数据验证的。 1.Hibernate Vali…...

技术分享 | App常见bug解析

功能Bug 内容显示错误 前端页面展示的内容有误。 这种错误的产生有两种可能 1、前端代码写的文案错误 2、接口返回值错误 功能错误 功能错误是在测试过程中最常见的类型之一&#xff0c;也就是产品的功能没有实现。比如图中的公众号登录不成功的问题。 界面展示错乱 产…...

树莓派Pico|RP2040|使用SWD进行调试|构建 “Hello World“ debug版本

文章目录 使用SWD进行调试构建 "Hello World" debug版本安装 GDB使用 GDB 和 OpenOCD 来 debug Hello World TIP重要提示 使用SWD进行调试 基于rp2040的板上的SWD端口重置&#xff0c;加载和运行代码&#xff0c;如树莓派Pico可用于交互式调试已加载的程序。这包括:…...

Ubuntu18.04 下配置Clion

配置Clion 安装gcc、g、make Ubuntu中用到的编译工具是gcc©&#xff0c;g&#xff08;C&#xff09;&#xff0c;make(连接)。因此只需安装对应的工具包即可。Ubuntu下使用命令安装这些包&#xff1a; &#xff08;1&#xff09;安装gcc sudo apt install gcc&am…...

数据库管理-第九十四期 19c OCM之路-第四堂(02)(20230725)

第九十四期 19c OCM之路-第四堂&#xff08;02&#xff09;&#xff08;20230725&#xff09; 第四堂继续&#xff01; 考点3&#xff1a;SQL statement tuning SQL语句调优 收集Schema统计信息 exec dbms_stats.gather_schems_stats(HR);开启制定表索引监控 create index…...

以智慧监测模式守护燃气安全 ,汉威科技“传感芯”凸显智慧力

城市燃气工程作为城市基建的重要组成部分&#xff0c;与城市居民生活、工业生产紧密相关。提升城市燃气服务质量和安全水平&#xff0c;也一直是政府和民众关注的大事。然而&#xff0c;近年来居民住宅、餐饮等工商业场所燃气事故频发&#xff0c;时刻敲响的警钟也折射出我国在…...

【阅读笔记】一种暗通道优先的快速自动白平衡算法

解决问题: 自动白平衡算法中存在白色区域检测错误导致白平衡失效的问题,作者提出了一种基于暗通道优先的白平衡算法。 算法思想: 图像中白色区域或者高饱和度区域的光线透射率较低,根据以上特性利用暗通道法计算图像中白色区域。 算法概述: 作者使用何凯明提出的基于暗…...

OpenStack之云主机管理

一&#xff09;必备知识 1.云主机与快照管理 a-云主机管理 云主机管理是OpenStack云计算平台的核心功能&#xff0c;通常&#xff0c;云主机的管理包括创建、删除、查询等。可使用以下命令对OpenStack的云主机进行管理&#xff1a; openstack server <操作><云主机…...

Linux系列---【Ubuntu 20.04安装KVM】

Ubuntu 20.04安装KVM 一、安装kvm 1.安装kvm sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils 2. 将当前用户添加至libvirt 、 kvm组 sudo adduser $USER libvirt sudo adduser $USER kvm 3.验证安装 virsh list --all 4.启动libvert sudo syst…...

【Vue3】局部组件和全局组件

1. 局部组件 Card.vue <template><div class"card"><header><div>标题</div><div>副标题</div></header><section>内容</section></div> </template><script setup lang"ts"…...

vscode开发Go和Java

vscode开发Go和Java 最新最全 vscode 插件推荐可以参考&#xff1a; https://zhuanlan.zhihu.com/p/623580867 1、公共插件安装 下面是个人使用的插件&#xff1a; # 中文插件 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code https://marketplace…...

自定义MVC

目录 一.什么是MVC 1.1.三层架构和MVC的区别 二.自定义MVC工作原理图 三.自定义mvc实现 3.1 创建web工程 3.2 中央处理器 3.3 Action接口定义 3.4 实现子控制器 3.5 完善中央控制器 3.5.1 请求分发功能 3.5.2 使用配置文件配置action 3.5.3 请求参数处理 1. 定义接…...

简单分享婚宴预订小程序怎么做

婚宴预订小程序需要具备一些功能&#xff0c;通过这些功能&#xff0c;新人可以更方便地选择婚宴场地、预订服务&#xff0c;并且更好地规划自己的婚礼。 1. 场地浏览与选择 婚宴预订小程序可以展示多个婚宴场地的照片和详细信息&#xff0c;包括容纳人数、场地设施、价格等。…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...