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

news2024/9/21 18:51:01

线程概念

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

🌵什么是线程

在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.cpp
	g++ -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
~本篇完结

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

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

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

相关文章

【需求响应DR】一种新的需求响应机制DR-VCG研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【技术架构】技术架构的演进

文章目录 前言1.名词解释(常见概念)1.1 应用&#xff08;Application&#xff09; / 系统&#xff08;System&#xff09;1.2 模块&#xff08;Module&#xff09; / 组件&#xff08;Component&#xff09;1.3 分布式&#xff08;Distributed&#xff09;1.4 集群&#xff08;…

AOP概念 和 使用

目录 AOP的概念 什么是AOP? 什么是SpringAOP? 为什要⽤ AOP? AOP的作用&#xff1f; AOP的组成 通知 AOP的实现 1. 添加 Spring AOP 框架⽀持。 2. 定义切面和切点。 3. 定义通知。 切点表达式 AOP的概念 什么是AOP? AOP&#xff08;Aspect Oriented Programm…

工程师分享:如何解决传导干扰?

电磁干扰 EMI 中电子设备产生的干扰信号是通过导线或公共电源线进行传输&#xff0c;互相产生干扰称为传导干扰。传导干扰给不少电子工程师带来困惑&#xff0c;如何解决传导干扰&#xff1f; 找对方法&#xff0c;你会发现&#xff0c;传导干扰其实很容易解决&#xff0c;只要…

献给大一新生的JavaSE入门篇章 大三秋招JavaSE

Java反射 反射实现有哪些? Class.forName(“com.jdbc.cj.Driver.mysql”) 类名.class 对象名.getClass() 反射优缺点有哪些? 优点: 能够动态的获取类的实例&#xff0c;提高灵活性 缺点: 会降低性能&#xff0c;解决办法: 1. 如果多次创建某个对象的实例&#xff0c;使用…

Pixelmator Pro 3.3.10 Mosaic (macOS Universal) - 专业图像编辑工具

Pixelmator Pro 3.3.10 Mosaic (macOS Universal) - 专业图像编辑工具 请访问原文链接&#xff1a;https://sysin.org/blog/pixelmator-pro-3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Pixelmator Pro 真正基于 Apple M…

机器学习算法实现(基于numpy)

《机器学习公式推导与代码实现》学习笔记&#xff0c;记录一下自己的学习过程&#xff0c;详细的内容请大家购买作者的书籍查阅。 这篇博客是将笔者边学边刷《机器学习公式推导与代码实现》的模型跟代码记录下来&#xff0c;部分地方结合自己的思考对原作者的代码有一定的改动…

【自定义图库】

sld文件 前段时间,有网友委托我帮他做一个家具的图库。 首先,做图库的方法有很多,最简单的是MFC拖控件然后自己把做好的bmp图贴进去就可以了,麻烦一点的是sld文件,最麻烦 是用blockview做。 下面先说说3种办法的区别: 首先,如果用MFC拖控件的办法,最简单也最方便,用st…

安全帽检测+反光衣检测+工作服检测数据集

安全帽检测反光衣检测工作服检测数据集下载地址分享:https://download.csdn.net/download/qq_34717531/88112870

AF 350 tyramide,AlexaFluor350 TSA,AF350酪胺,荧光标记试剂

文章资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu​ PART1----产品描述 AF350 tyramide&#xff08;AlexaFluor350酪酰胺&#xff09;&#xff0c;用于荧光标记的试剂&#xff0c;Tyramide信号放大&#xff08;TSA&#xff09;已被证明是一种特别通用且…

SAS-input和put的使用

在SAS中经常会遇到数值型变量与字符型变量之间进行相互转换&#xff0c;如何进行转换呢&#xff1f; 一、字符型转数值型 方法1&#xff1a;字符型变量通过运算进行转换&#xff0c;如Numeric Character * 1。运算符可以转换&#xff0c;但是会有NOTE提示&#xff0c;不推荐…

一个外贸业务员的鸡飞蛋打

最近在论坛上看到一个案例&#xff0c;案例是一个是SOHO的业务员从他朋友厂子拿货, 然后他发现他的前同事在他朋友的厂子做sales director&#xff0c;然后最近一个客户A出货&#xff0c;这个小伙伴就去他朋友的工厂做发货前的质检&#xff0c;正好碰到以前的一个同事也去他朋友…

【Docker】Docker安全性与安全实践(五)

前言&#xff1a; Docker安全性的作用和意义在于确保容器化应用程序和镜像的隔离性、保护数据和系统资源、防止恶意攻击&#xff0c;以及提高应用的整体安全性。 文章目录 1. Docker安全性1.1 隔离性1.2 镜像安全1.3 特权访问1.4 数据保护 2. Docker安全实践2.1 使用官方镜像或…

管理类联考——数学——趣味篇——可视化——安装Manim软件

Manim: 一个数学可视化的动画引擎 官网&#xff1a;https://3b1b.github.io/manim/index.html 名词解析 python3.7是python语言的解释器, 运行python程序的环境必备品. 这个没啥说的,大家都能懂. 虽然官方建议3.7,但是我用3.8发现也没问题.考虑未来的历史进程,大伙最好还是装…

Windows Subsystem for Android (WSA) 下载:在 Windows 11 上运行 Android 应用 (July 2023)

Windows Subsystem for Android (WSA) 下载&#xff1a;在 Windows 11 上运行 Android 应用 (July 2023) 适用于 Android™️ 的 Windows 子系统&#xff0c;2023 年 7 月更新&#xff1a;2306.40000.4.0 请访问原文链接&#xff1a;https://sysin.org/blog/wsa/&#xff0c;…

探讨高校公共建筑能耗监测系统的设计与应用

安科瑞 华楠 摘要&#xff1a;在资源节约型社会建设进程中&#xff0c;高校公共建筑能耗管理存在问题已经成为办学成本加大、社会资源浪费的桎梏。在各级政府的推动下&#xff0c;高校公共建筑能耗监测系统建设在探索中发展&#xff0c;依托互联网大数据技术逐步实现能耗管理信…

跨域冲突问题解决

1、问题分析 服务端和nginx代理 都做了跨域配置&#xff0c;导致请求头重复 headers 里面有两个重复的 Access-Control-Allow-Origin Access-Control-Allow-Methods Access-Control-Allow-Credentials 2、解决方法 在nginx去除服务端的跨域配置 proxy_hide_header Access-…

【腾讯云 Cloud Studio 实战训练营】CloudStudio体验真正的现代化开发方式,双手插兜不知道什么叫对手!

CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01; 文章目录 CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01;前言出现的背景一、CloudStudio 是什么&#xff1f;二、CloudStudio 的特点三、CloudS…

医学案例|配对wilcoxon符号秩检验

一、案例介绍 某单位想要研究某保健品对小鼠是否具有抗疲劳作用&#xff0c;将同种属的小鼠按性别与年龄相同、体重相近配成对子&#xff0c;共14对&#xff0c;并将每对中的两只小鼠随机分配到两个不同的保健食品剂量组&#xff0c;测量小鼠负重5&#xff05;体重时的游泳时间…

通过IDEA发送QQ邮箱信息

先创建一个普通的Maven项目&#xff0c;我就不演示啦&#xff0c;个人博客已经写过~[创建一个maven项目]。 项目创建成功后&#xff0c;引人Maven依赖&#xff0c;如下: <dependencies><dependency><groupId>org.apache.commons</groupId><artifact…