【Linux】线程基础----概念、区别于进程、线程库的使用等

Windows和Linux下多线程编程 Thread Windows和Linux下多线程编程 立即下载

       

目录

一、了解线程

二、线程的实现方式

三、线程与进程的区别

四、线程库的使用

五、多线程的数据共享问题


在前面对于进程包括其概念、创建、释放以及进程间通讯的方式等之后,我们再提到比进程还要轻量的一个执行序列就是线程。线程是轻量级的进程,换句话说线程是被进程所包含的,进程里中是存在线程的。

一、了解线程

        我们从两方面去理解线程:一是线程是轻量级的进程;二是线程是进程内部的一条执行序列(一组有序指令),或者说是执行流,线程也是动态的概念。

        轻量级:创建:创建进程时分配资源,后期创建线程时不会分配资源;

        调度:线程的切换比进程调度速度快;

        注意:

         一个进程至少有一条线程,即就是main函数所代表的执行序列。称之为主线程。通过线程库就可以创建线程-----函数线程。

         主线程仅仅代表进程执行的第一条线程而已。当主线程通过线程库创建出线程以后,所有的线程就无任何区别。

主线程默认结束,结束的是整个进程。

二、线程的实现方式

         用户级:线程的创建、销毁、管理都是在用户空间完成,内核只会识别为一个进程,一条线程。优点是灵活性,操作系统不知道线程存在,在任何平台上都可以运行;线程切换块,线程切换在用户空间完成,不需要陷入内核;不用修改操作系统,实现容易。缺点是编程复杂,用户必须自己管理线程,包括线程调度;如果一个线程阻塞,整个进程都会阻塞,不能使用对称多处理器。

        内核级:线程的创建、销毁、管理由操作系统内核完成。内核线程使得用户编程简单,但是每次切换都得陷入内核,所以效率较低。

        混合模式:即就是一部分以用户级线程创建,一部分由内核创建,是一个多对多的关系。结合用户级和内核级的优点。

三、线程与进程的区别

         (1)线程是(CPU)系统调用的最小单位,进程是资源分配的最小单位;

         (2)线程依赖于进程,线程在进程内部,一个进程至少包含一条线程;

         (3)进程都是相互独立的,同一个进程中的线程除了线程的栈区,其他资源都共享;

         (4)进程通讯需要特殊的机制,县城通讯则可直接借助全局空间,或是堆区空间;

         (5)线程存在线程安全问题;

         (6)线程切换相比进程切换效率高

         (7)创建线程比创建进程快,线程所消耗的资源比进程少。

四、线程库的使用

        头文件#include<pthread.h>

        1、线程创建

        统一进程中的线程都是并发执行的,线程的执行顺序是不一定的,是由系统当前环境和线程调度算法决定的。

        Int pthread_create(pthred_t *id, pthread_attr_t *arr,void*(*pthread_fun)(void*), void*arg);
        Id:线程id 创建线程时分配的线程ID;传递一个变量的地址;

        Attr:线程属性,默认为NULL

        Pthread_fun:线程函数 新创建的线程的执行体,函数地址:指定新线程从那块开始执行;

        Arg:传递给线程函数的参数,(arg的值会传给void*,传给所调用的函数);

        返回值:assert(res==0);成功返回0,失败返回错误码;

         创建进程和线程底层都是调用的是clone函数;

                     (1)值传递:最多传递四字节的数据,指针将传递的值直接强转为void*;

                          arg:类型是void*  记录传递的值

                      (2)地址传递:将要传递的值的地址转化为void*;

                           arg:类型是void*  记录的是传递的地址

                             地址传递时主线程后期对值的修改可能会影响函数线程中获取值

                              函数线程中通过地址对变量修改,也会影响主线程中变量的值;

         Strace:限时进城执行过程中的所有的系统调用函数;

         Ltrace:显示进程执行过程中的所有库函数;

        2、线程结束

        Int pthread_exit(void *);

        注意:Main函数结束代表进程结束,exit(0),线程依赖于进程,进程结束,所有线程随之结束;

        等待线程结束函数:int pthread_jojn(pthread_t id, void **retval);//等待线程结束,获取线程退出信息;

        取消一个线程:int pthred_cancel(pthread_t id);//发出取消请求,并不会等待

五、多线程的数据共享问题

         创建线程只会在进程资源中申请栈区资源用于线程函数的执行;只会分配虚拟地址的空间,当真正用的时候(即运行)才会映射到内存中;进程中的数据区域、堆区、多线程都是共享的,即使用同一份。

         1、全局数据:共享的。虚拟地址相同。统一进程的多线程共享进程的4G虚拟地址空间。

         2、堆区:共享的

         3、栈区:不共享;创建线程时,将栈区数据的地址传递给函数线程,实现共享;通过该地址访问栈区;

         4、文件描述符:共享的;文件资源试给进程分配的,同一进程所访问的表数组是一样的,指针是同一份。

        由于对于多线程间有许多共享的资源,在线程间共享数据的方式:

             将数据定义到全局;

             将数据保存到堆区;

             栈区---》创建线程时,将栈区数据的地址传递给函数线程;

Fluent后台计算中Journal文件的自动化编写与优化实践 本文深入探讨了Fluent在Linux/Unix环境下进行后台计算时,Journal文件的自动化编写与优化实践。Journal文件作为Fluent后台计算的“灵魂”,是实现仿真流程自动化、保证计算可重复性与准确性的关键。文章从基础脚本骨架搭建、命令简写技巧,到进阶的参数化研究与批量计算实现,提供了详实的实战指南,帮助工程师大幅提升仿真效率。 阅读详情

相关推荐

【机械视觉】Halcon—【二、Halcon算子全面介绍(超详细版)】

Halcon 的算子(operators)按照功能被系统性地划分为多个类别,官方文档中目前(Halcon 22.11 版本)共有 19 个主分类,每个主分类下还有若干子分类。 本人在此对这19个分类的常用核心算子进行了一系列的总结,且本人在文章最后还总结了一些案例经验。 注意: ​​​​​​​跨分类调用:某些算子可能在多个分类中,但官方文档中会明确其主分类。 例如: read_image(文件操作)常被其他分类(如图像处理)的示例调用,但其核心功能是文件读取。

qq_3517289697的博客 3913

linux多线程和C++多线程什么关系 ? 有什么共同点? 和不同点? 使用场景分别是什么?

1.C++的多线程实际是建立在pthread库上的高级封装,共享相同的底层线程模型。2.C++多线程相对linux多线程优点:可移植性更高 ,便于移植到Windows,macOS缺点 :API较少。

weixin_57672347的博客 769

Coze HTTP请求节点实战:5分钟搞定天气API对接(含动态参数技巧)

本文通过一个天气预报API对接的实战案例,详细讲解了如何在Coze平台使用HTTP请求节点实现外部数据交互。文章重点演示了动态参数传递、JSON响应解析与错误处理等核心技巧,帮助开发者在5分钟内快速构建稳定可靠的智能体外部服务调用能力。

weixin_29233333的博客 675

C++线程与原生线程

C++线程与原生线程 Intro:写本文时,笔者正被C++线程与Linux原生线程所困扰,本文通过简单比较其原理和基本概念,可以帮助读者梳理二者区别。 1. posix thread介绍 POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准意在期望获得源代码级别的软件可移植性。换句话说,为一个POSIX兼容的操作系统编写的程序,应该可以在任何其它的POSIX操作系统(即使是来自另一个厂商)上编译执行

dblinux 1311

H265/HEVC视频分层码流分析语义元素解释

一、H265概述 H265/HEVC(Hight Efficiency Video Coding)是由ITU-T和ISO/IEC两大组织在H264/AVC的基础之上推出的新一代高效视频编码标准,主要为应对高清和超高清视频在网络传输和数据存储方面带来的挑战。上一篇文章对H264/AVC视频码流进行了详细的分析,本文继续从数据处理的角度对H265/HEVC视频码流进行详细分析。 二、H265分层结构 H265的分层结构与H264类似,分为视频编码层(VCL:Video Code Layer)和网络抽象层(NAL

weixin_43876729的博客 9431

解决UNITE数据库注释高unassigned率:手把手教你训练专属真菌分类器(含预训练模型分享)

本文针对使用UNITE数据库进行真菌ITS序列注释时出现的高未分配率问题,提供了详细的实战解决方案。通过对比vsearch直接注释与Naive Bayes分类器的原理差异,文章手把手指导读者在QIIME 2环境中训练专属分类器,包括数据准备、模型训练、参数优化及效果验证,并分享了预训练模型,旨在显著提升真菌群落分析的注释准确性和数据利用率。

weixin_29214199的博客 338

c 线程库和linux线程库的区别,linux下的线程linuxthreads和NPTL的比较

前段时间在CU上问过这两个线程机制的问题,现在基本上弄清楚了。以下文字是抄袭+理解+估计:传统的linuxthreads中和新的NPTL均是1:1模型。在redhat家族中,RH9以前的版本用的是linuxthreads,即有一个用户级的管理线程来维护;但在这以后,都是NPTL,用户态不再需要管理线程了。当然这是表面上的区别,实质的区别主要是其处理机制,NPTL的设计目标归纳可归纳为以下几点:* ...

weixin_36075067的博客 420

【Unity实战】HybridCLR热更快速集成

本文假设你已经通过UPM导入了HybridCLR、Addressables、il2cpp支持并具有一定的C#基础和Unity编辑器操作能力。

u012587406的博客 4994

C++11线程池和Linux C++线程对比使用

【代码】C++11线程池和Linux C++线程对比使用。

weixin_45715405的博客 962

GPS数据处理必备:IGS精密星历下载与使用全攻略(附武汉大学/CDDIS/CODE/GFZ地址)

本文为GPS/GNSS数据处理者提供了IGS精密星历的完整下载与使用指南。详细解析了最终、快速、超快速三种精密星历产品的区别与选择策略,并手把手教学如何从武汉大学、CDDIS、CODE、GFZ四大主流数据中心高效获取数据,涵盖文件命名规则解析及自动化下载脚本,助力科研与工程应用。

weixin_29234239的博客 678

基于LSTM GRU RNN的交通流量预测-完整数据代码

基于LSTM GRU RNN的交通流量预测-完整数据代码

921

进程、线程、程序的区别以及动态库和静态库的区别

2、静态库链接时需要拷贝一份完整的文件到目标文件中,然后一起链接生成可执行文件,而动态库不需要,动态库分动态加载库和动态链接库,动态加载库是程序运行时需要的时候才会被加载到内存中,动态链接库是项目生成的可执行文件被加载到内存中时,顺带着也会将动态链接库加载到内存中,这种方式会导致系统资源浪费。每一个进程都有自己独立的地址空间,任务切换时频繁切换地址空间耗时,由于进程的地址空间是私有的,因此在进程间的上下切换时,系统开销比较大,为了提高系统的性能,许多操作系统规范里引入了轻量级进程的概念,也被成为线程。

weixin_72236292的博客 563

html2canvas - 解决截图后引入的字体样式丢失问题,第三方字体截图导出图片后字体失效,html2canvas截屏生成图片后艺术字体就丢失并且自动转成常规字体了,特殊字体显示不了无法截图怎么办

vue2,vue3,uniapp,html2canvas截图后引入的字体样式丢失,html2canvas艺术字截图不显示,使用外部字体无效,html2canvas无法识别网络字体文件怎么办,ttf文件,网页使用在线字体链接利用html2canvas无法截取,字体样式没有了,font-family第三方字体,@font-face引入本地字体文件后无法被html2canvas识别怎么办,html2canvas文字消失,vue页面正常显示艺术字体但截屏后没有,html2canvas截图存在特殊字体时截图不全,默认

✅ 精选推荐文章 1万+

【LInux】线程thread从内核原理到C++封装

笔者最近在学习Linux,打算对线程到网络部分的学习做一份较为全面的总结,笔者将把这段时间的博客代码都放在gittee仓库中,有需要可以自取本篇博客所用代码位于本篇博文对线程thread从内核原理到C++封装做了一个较为详细的介绍,不知道对你有没有帮助呢觉得博主写得还不错的三连支持下吧!会继续努力的~

2301_77954967的博客 1325

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux线程深度解析:从基础到实践

线程是Linux高并发编程的核心工具,理解其与进程的区别、接口使用及同步机制是关键。在实际开发中,需根据场景选择合适的并发模型(多进程/多线程/异步),并注意资源竞争、性能瓶颈等问题。通过合理设置线程属性和使用同步工具,可充分发挥多核CPU性能,实现高效的并行计算。

w20010915的博客 897

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一文吃透 Linux 多线程编程:概念、操作与同步互斥

进程:系统中最小的资源分配单位,分配CPU、内存等系统资源,拥有独立的用户空间内存(0~3G)。线程:系统中最小的执行单位,执行具体的代码逻辑,本身不独立分配资源,而是共享所属进程的资源。Linux多线程编程是系统编程的核心内容,其核心优势在于轻量级、资源共享、通信高效,适合处理轻量级并发任务。本文梳理了多线程的核心知识点:线程与进程的本质区别:进程是资源分配单位,线程是执行单位,线程共享进程资源仅私有栈区;

fan121380的博客 727

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux线程

1 线程的概念: 进程内部的一条执行序列(执行流,有序指令的集合),一个进程可以包含多条线程,至少有一条线程,就是main方法所代表的这条执行流- -主线程。 进程中的线程仅仅是有一个独自的栈区空间(区别于栈帧)(包含了线程执行的数据) 线程管理的提出前,OS一直以进程作为独立运行的基本单位 为什么使用线程?(性能问题) 提出一种新的实体,线程 1.满足实体之间可以并发的执行(与进程类似) 2.实体之间共享相同的地址空间和相同的资源(与进程不同,进程的地址空间相对是独立的,若A进程要访问B进程的地址空间需

wuguinianjing的博客 346

【Linux】线程id

🔥个人主页Quitecoder🔥linux笔记仓。

Quietcoder的博客 976

Linux内核学习(二)---Linux中的进程、线程和轻量级进程

对于操作系统教科书中是这样定义的;进程是程序执行的一个实例。它是资源配置的最小单位;而为了提高程序的并行性同时降低上下文切换的时间消耗,提出了线程的概念,一个进程中可以有多个线程,线程是程序执行的最小单位;        在Linux系统中,Linux内核有必要再区分一下这几个概念;        进程,从内核观点看,进程的目的就是担当分配系统资源(包括CPU时间、内存等)的实体;当一个进程创

pinpinq的博客 631

linux 嵌入式 僵尸线程,Linux下的线程

6.1线程的基本概念:Linux中的线程是轻量级线程(lightweight thread)。Linux的线程调度是由内核调度程序完成的,每个线程有自己的ID号。与进程相比,它们消耗的系统资源较少,创建较快,相互间的通信也较容易。存在于同一进程中的线程会共享一些信息,这些信息包括全局变量,进程指令,大部分数据,信号处理程序和信号设置,打开的文件,当前工作的目录以及用户ID和用户组ID.同时作为一个...

weixin_42495057的博客 295

第六章 Linux下的线程

第六章  Linux下的线程   6.1线程的基本概念:    Linux中的线程是轻量级线程(lightweight thread)。Linux的线程调度是由内核调度程序完成的,每个线程有自己的ID号。与进程相比,它们消耗的系统资源较少,创建较快,相互间的通信也较容易。存在于同一进程中的线程会共享一些信息,这些信息包括全局变量,进程指令,大部分数据,信号处理程序和信号设置,打开的文件

341

【C++与Linux基础】进程间的信号

本文摘要: 本文介绍了Linux系统中信号的基本概念与应用。通过实验代码演示了信号处理函数的使用方法,验证了Ctrl+C发送的是2号信号(SIGINT)。测试发现9号(SIGKILL)和19号(SIGSTOP)信号不可被自定义捕获,这是操作系统的保护机制。文章对比了信号与信号量的区别,前者用于进程间异步通知,后者用于资源同步控制。最后介绍了kill系统调用的基本用法。通过实践展示了信号在Linux进程通信中的重要作用。(149字)

2301_80127108的博客 453

Linux部分底层机制

本文主要介绍了POSIX线程标准和Linux线程实现机制。POSIX标准定义了一套跨平台线程API(Pthreads),包括线程创建、同步等函数,确保程序可移植性。Linux底层通过clone()系统调用实现线程创建,通过标志位控制资源共享。NPTL是现代Linux的线程实现,采用1:1模型并利用futex机制提高性能。文章还解释了线程局部存储(TLS)的作用,它允许每个线程拥有变量的独立副本,用于存储线程私有数据。最后通过示意图展示了POSIX API、线程库和内核机制之间的关系。

2302_80908313的博客 906

Linux多任务-线程篇

线程最直接的理解就是轻量级进程,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但。。由于线程之间相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

Vvc_Python的博客 511

Linux---线程---全面讲解

Linux线程作为轻量级执行单元,在系统编程中扮演着关键角色。本文系统讲解了线程基础概念、核心API、同步机制和高级特性。重点内容包括:线程与进程的本质区别,Linux通过轻量级进程实现线程;pthread库的核心操作如创建、等待、终止和分离线程;多种同步机制(互斥锁、条件变量、读写锁等)的原理与使用场景;线程局部存储、线程安全等高级特性;以及死锁、线程泄漏等常见问题的解决方案。文章结合代码示例和底层实现细节,帮助开发者深入理解Linux线程的运行机制和最佳实践。

我的博客主要是用来给我自己复习的,主要是上传一些知识点,小型的项目和功能模块,如果有什么问题或错误麻烦联系我! 1815

嵌入式Linux软件开发并发编程

《嵌入式Linux并发编程核心要点》摘要:本文系统阐述了嵌入式Linux并发编程的关键技术与工程实践。针对嵌入式设备资源受限、实时性要求高的特点,重点分析了四大并发模型(多进程、多线程、信号驱动、异步IO)的适用场景与实现原理,深入讲解了同步互斥机制(互斥锁、自旋锁、条件变量等)的嵌入式优化方案。文章揭示了数据竞争、死锁等典型问题的根治方法,对比了七种IPC通信机制的选型策略,并提供了线程架构、实时性、功耗等维度的工程级优化建议。

Mr_-G,一名勤奋底层软件开发工程师的博客 474
上一篇: 【Linux】进程基础——进程的管理方式、状态以及加载等
下一篇: 【c++】函数模板
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值