Linux C/C++编程中的多线程编程基本概念

Linux C++多线程编程 1.介绍   使用多线程的理由之一是和进程相比,它是一种非常”节俭”的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种”昂贵”的多任务工作方式。而运行一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程,而且,线程间彼此切换所需的时间也... 阅读详情

8.2.1  操作系统和多线程

要在应用程序中实现多线程,必须有操作系统的支持。Linux 32位或64位操作系统对应用程序提供了多线程的支持,所以Windows NT/2000/XP/7/8/10是多线程操作系统。根据进程与线程的支持情况,可以把操作系统大致分为如下几类:

(1)单进程、单线程,MS-DOS大致是这种操作系统。

(2)多进程、单线程,多数UNIX(及类UNIX的Linux)是这种操作系统。

(3)多进程、多线程,Win32(Windows NT/2000/XP/7/8/10等)、Solaris 2.x和OS/2都是这种操作系统。

(4)单进程、多线程,VxWorks是这种操作系统。

具体到Linux C++的开发环境,它提供了一套POSIX API函数来管理线程,用户既可以直接使用这些POSIX API函数,也可以使用C++自带的线程类。作为一名Linux C++开发者,这两者都应该会使用,因为在Linux C++程序中,这两种方式都有可能出现。

8.2.2  线程的基本概念

现代操作系统大多支持多线程概念,每个进程中至少有一个线程,所以即使没有使用多线程编程技术,进程也含有一个主线程,所以也可以说,CPU中执行的是线程,线程是程序的最小执行单位,是操作系统分配CPU时间的最小实体。一个进程的执行说到底是从主线程开始的,如果需要,可以在程序任何地方开辟新的线程,其他线程都是由主线程创建的。一个进程正在运行,也可以说是一个进程中的某个线程正在运行。一个进程的所有线程共享该进程的公共资源,比如虚拟地址空间、全局变量等。每个线程也可以拥有自己私有的资源,如堆栈、在堆栈中定义的静态变量和动态变量、CPU寄存器的状态等。

线程总是在某个进程环境中创建的,并且会在这个进程内部销毁。线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时,该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其他线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和线程栈,线程栈用于维护线程在执行代码时需要的所有函数参数和局部变量)。

相对于进程来说,线程所占用的资源更少。比如创建进程,系统要为它分配很大的私有空间,占用的资源较多;而对于多线程程序来说,由于多个线程共享一个进程地址空间,因此占用的资源较少。此外,进程间切换时,需要交换整个地址空间,而线程间切换时,只是切换线程的上下文环境,因此效率更高。在操作系统中引入线程带来的主要好处是:

(1)在进程内创建、终止线程比创建、终止进程要快。

(2)同一进程内线程间的切换比进程间的切换要快,尤其是用户级线程间的切换。

(3)每个进程具有独立的地址空间,而该进程内的所有线程共享该地址空间,因此线程的出现可以解决父子进程模型中子进程必须复制父进程地址空间的问题。

(4)线程对解决客户/服务器模型非常有效。

虽然多线程给应用开发带来了不少好处,但并不是所有情况下都要去使用多线程,要具体问题具体分析。通常在下列情况下可以考虑使用多线程:

(1)应用程序中的各任务相对独立。

(2)某些任务耗时较多。

(3)各任务有不同的优先级。

(4)一些实时系统应用。

值得注意的是,一个进程中的所有线程共享它们父进程的变量,但同时每个线程可以拥有自己的变量。

8.2.3  线程的状态

一个线程在从创建到结束这一生命周期中,总是处于下面4个状态中的一个。

1)就绪态

线程能够运行的条件已经满足,只是在等待处理器(处理器要根据调度策略来把就绪态的线程调度到处理器中运行)。处于就绪态的原因可能是线程刚刚被创建(刚创建的线程不一定马上运行,一般先处于就绪态),也可能是刚刚从阻塞状态中恢复,还可能是因被其他线程抢占而处于就绪态。

2)运行态

运行态表示线程正在处理器中运行,正占用着处理器。

3)阻塞态

由于在等待处理器之外的其他条件而无法运行的状态叫作阻塞态。这里的其他条件包括I/O操作、互斥锁的释放、条件变量的改变等。

4)终止态

终止态就是线程的线程函数运行结束或被其他线程取消后处于的状态。处于终止态的线程虽然已经结束了,但它所占资源还没有被回收,而且还可以被重新复活。我们不应该长时间让线程处于这种状态,线程处于终止态后应该及时进行资源回收,下面会讲到如何回收。

8.2.4  线程函数

线程函数就是线程创建后进入运行态后要执行的函数。执行线程说到底就是执行线程函数。这个函数是我们自定义的,然后在创建线程时把我们的函数作为参数传入线程创建函数。

同理,中断线程的执行就是中断线程函数的执行,以后再恢复线程的时候,就会在前面线程函数暂停的地方继续执行下面的代码。结束线程也就不再运行线程函数。线程的函数可以是一个全局函数或类的静态函数,比如在POSIX线程库中,它通常这样声明:

void *ThreadProc (void *arg);

其中,参数arg指向要传给线程的数据,这个参数是在创建线程的时候作为参数传入线程创建函数中的。函数的返回值应该表示线程函数运行的结果:成功还是失败。注意函数名ThreadProc可以是自定义的函数名,这个函数是用户自己先定义好,然后由系统来调用。

8.2.5  线程标识

既然句柄是用来标识线程对象的,那线程本身用什么来标识呢?在创建线程的时候,系统会为线程分配唯一的ID作为线程的标识,这个ID从线程创建开始就存在,一直伴随着线程的结束才消失。线程结束后,该ID就自动不存在,我们不需要去显式清除它。

通常线程创建成功后会返回一个线程ID。

8.2.6  C++多线程开发的两种方式

在Linux C++开发环境中,通常有两种方式来开发多线程程序:一种是利用POSIX多线程API函数来开发多线程程序,另一种是利用C++自带线程类来开发多线程程序。这两种方式各有利弊。前一种方法比较传统,后一种方法比较新,是C++11推出的方法。为何C++程序员也要熟悉POSIX多线程开发呢?这是因为C++11以前,在C++里面使用多线程一般都是利用POSIX多线程API,或者把POSIX多线程API封装成类,再在公司内部供大家使用。因此,一些老项目都是和POSIX多线程库相关的,这也使得我们必须熟悉它,因为很可能进入公司后会要求维护以前的程序代码。而C++自带线程类很可能在以后开发新的项目时会用到。总之,技多不压身。

本文节选自《Linux C与C++一线开发实践(第2版)》,获出版社和作者授权发布。

 

原创作者: brucexia 转载于: https://www.cnblogs.com/brucexia/p/18583247
Linux C/C++多线程编程入门:核心概念讲解 Linux C/C++多线程编程是一项强大的技术,它可以帮助开发者编写出更高效、更灵活的程序。然而,多线程编程也是一项复杂的任务,需要开发者深入理解线程的基本概念、同步机制以及相关的注意事项。通过本文的介绍,相信您已经对Linux C/C++多线程编程的核心概念有了初步的了解。接下来,您可以进一步学习相关的API和示例代码,以加深理解和实践应用。祝您在Linux C/C++多线程编程的道路上越走越远! 阅读详情

相关推荐

【图书介绍】】几本Linux C\C++编程图书

Linux C\C++编程,是IT领域比较稳定的职业发展方向,本文介绍几本开发方面的图书。

夏天又到了的专栏 985

C++程序员内功修炼——Linux C/C++编程技术汇总

在软件开发的宏大版图中,C++ 语言宛如一座巍峨的高山,吸引着无数开发者攀登探索。而 Linux 操作系统,以其开源、稳定、高效的特性,成为了众多开发者钟爱的开发平台。将 C++ 与 Linux 相结合,就如同为开发者配备了一把无坚不摧的利刃,能够在系统级编程、高性能计算、游戏开发等诸多领域披荆斩棘。对于 C++ 程序员而言,掌握 Linux 环境下的 C/C++ 编程技术,不仅仅是提升自身技能的关键一步,更是在激烈的职场竞争中脱颖而出的必备法宝。

深度Linux 2681

Linux环境下的C++多线程网络编程手册

多线程是指一个程序中可以同时运行多个线程,每个线程执行不同的任务。它是操作系统能够进行运算调度的最小单位,可以让程序的执行效率得到显著提升。理解线程概念是学习多线程编程的基础,线程之间可以共享进程资源,但也可能因为资源竞争引发问题,如死锁等。非阻塞I/O和异步I/O为多线程网络编程提供了更灵活、高效的处理I/O请求的能力。它们通过减少等待时间和提升并行处理能力来改善性能。然而,它们的复杂性要求开发者具备深入的理解和细致的错误处理能力,这才能在实际应用中发挥最大效益。

weixin_34456923的博客 1027

C++(2)之Linux多线程服务端编程总结

Author: Once Day Date: 2023年1月31日/2024年8月23日一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…漫漫长路,有人对你微笑过嘛…

梅花香自苦寒来,宝剑锋从磨砺出。 2527

将机器人urdf模型转换为Mujoco环境下的mjcf模型

在使用gym环境进行人形模型站立训练的过程中,我想要将之前ros环境下的机器人urdf模型导入到mujoco环境下,这时候就需要将urdf模型转换为mujoco专用的mjcf模型。-AzureLoong.urdf是机器人模型(我这里使用青龙的模型);--custom_robot.xml是转换完成之后的机器人模型的名字和格式;包要求 Python 版本必须是 3.11 或更高),保证自己的其他训练环境和依赖不被干扰。首先将meshes文件迁移到需要输出的目录下,然后再运行转换命令。最后就可以成功输出了。

weixin_44334573的博客 3754

PX4 Offboard模式实战避坑:为什么你的Gazebo无人机解锁了却飞不起来?

本文深入解析PX4 Offboard模式下Gazebo无人机解锁后无法起飞的关键原因,提供详细的故障排查流程和调试方法。重点解决MAVROS连接、setpoint消息频率、坐标系一致性等常见问题,帮助开发者快速掌握无人机控制核心技术。

weixin_33461476的博客 326

Linux C/C++ 多线程开发 - 基础介绍

​Linux C/C++多线程开发基础介绍

weixin_51958878的博客 1176

电动汽车充电设备标准化设计方案:电气原理图

80kW一体式一机一枪充电机电气原理 主电路拓扑见图1,配置1个250A直流充电连接装置,提供4个充电模块安装位置,根据充电功率需求可选配2~4个20kW充电模块。内置直流电能表和计费控制单元,实现计量计费和充电控制功能。 图1 80kW一体式一机一枪充电机主电路拓扑 ...

santirenpc的博客 1万+

Linux C/C++编程技术汇总

手写代码实现:sdpk文件系统,dpdk用户态协议栈,异步网络库zvnet ,协程,io_uring,Nginx,bpf,线程池,内存池,连接池,原子操作,ringbuffer,定时器,死锁检测,分布式锁,日志,probuf,kafka,grpc,udp可靠传输;io_ _uring系统调用io_ _uring_ setup, io_ _ur ing_ register, io_ _ur ing_ enter。io_ ur ing的accept, connect, recv, send实现机制。

xjfgkf的博客 2184

WhatsApp协议算法

我想其实有很多人还不太了WhatsApp群控,简单来说,它和我们常使用的微信聊天软件是类似的,只不过它是基于通讯录的,操作起来比较简单便捷,所以现在有很多国家都喜欢用WhatsApp。一般情况下,筛号不会造成账号被封的情况,但是呢,如果筛号的频率太快,就会被系统限制筛号能力,不再返回筛号结果,所以,筛号数量和速度一定要控制好。前天逛街突然灵光一现,为什么不试试多路访问呢,简单来说就是信道复用技术,马上跑回家,调取接口,接入通道,导入已经转换成协议的账号,成功登录!

2403_87755661的博客 1942

飞书组织架构同步至LDAP:实现企业应用统一身份认证的实战指南

本文详细介绍了如何将飞书组织架构同步至LDAP,实现企业应用统一身份认证的实战方案。通过飞书开放平台API与LDAP服务的集成,企业可以大幅减少账号管理工作量,提升IT效率。文章涵盖技术架构设计、密码策略、详细配置步骤及自动化同步实现,特别适合需要统一认证体系的中大型企业。

weixin_29172201的博客 332

【宠粉赠书】Linux C与C++一线开发实践

为了回馈粉丝们的厚爱,今天小智给大家送上一套Linux开发学习的必备书籍——《Linux C与C++一线开发实践》。《Linux C与C++一线开发实践》贴近软件公司一线开发实践,系统讲解Linux C/C++网络应用开发方法。全书内容针对初中级读者,假设读者没有接触过C/C++编程和Linux系统开发,任何立志成为一名Linux开发工程师的人,都可以从本书起步。全书厚达620多页,内容通俗易懂,由浅入深,并且实例丰富、步骤详细、注释充分,能帮助读者快速入门。

踏雨歌青春,诗酒趁年华 5843

AUTOSAR进阶图解==>AUTOSAR_SWS_ADCDriver

本文深入解析了AUTOSAR ADC Driver的架构设计和技术实现。主要内容包括:1)ADC Driver在AUTOSAR分层架构中的定位及核心功能;2)详细的模块架构设计,涵盖初始化管理、组转换管理、优先级处理等核心子组件;3)全面的配置模型说明,包括主配置类、通用配置、通道配置等关键数据结构;4)状态机机制和操作序列分析。通过分层设计和标准化接口,ADC Driver实现了硬件抽象和软件解耦,提供了良好的可移植性和可维护性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 786

Linux C/C++编程——线程

线程

pyh1322712308的博客 846

Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案

本博客在总结这些问题及其解决方案,为遇到类似问题的兄弟提供参考,如果我后续有碰到其他Docker 问题也会在此更新补充。

我其实什么都不会 1645

ARFoundation系列讲解-教程目录

一、教程目录 ARFoundation快速入门-01简介 ARFoundation快速入门-02环境搭建 ARFoundation快速入门-03环境配置之iOS ARFoundation快速入门-04环境配置之Android ARFoundation快速入门-05ARKit设备支持列表 ARFoundation快速入门-06ARCore设备支持列表 ARFoundation快速入门-07检查设备支持 ARFoundation快速入门-08平面检..........

a451319296的博客 3万+

AI回答:Linux C/C++编程学习路线

按照以上路线坚持学习,你将逐步掌握Linux C/C++编程的核心技能,成为一名优秀的开发者!学习C++11/14/17/20的新特性:Lambda表达式、智能指针、并发库等。:LeetCode(算法练习)、CppReference(文档查询)。:B站、Coursera上的Linux C/C++课程。进程间通信(IPC):管道、消息队列、共享内存、信号。学习select、poll、epoll等多路复用技术。配置开发工具:GCC、GDB、Make、CMake。语法基础:变量、数据类型、控制语句、函数。

ctrigger的专栏 1549

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Linux C/C++多线程pthread实例

inux中C/C++开发多线程程序多遵循POSIX线程接口(也就是pthread),pthread涉及函数很多个(更多参见pthread.h头文件),常用的有pthread_create、pthread_dispath、pthread_mutex_lock(互斥锁定)、pthread_mutex_unlock(互斥解锁)等。入门而言,先把线程创建出来,然后编译通过之后再慢慢完善,具体步骤如下。

轻锋的专栏 1939

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Linux环境下多线程C/C++程序的内存问题诊断

Linux下C/C++内存问题诊断经验分享

曲折旅程,艰难人生 1911

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux多线程C/C++

在 Linux 中,多线程编程可以显著提高应用程序的性能和响应能力。多线程允许程序在多个线程中并行执行,从而更好地利用多核处理器。Linux 中的多线程编程主要依赖于 POSIX 线程(pthread)库。这个库提供了创建、同步和管理线程的各种函数。使用 头文件可以实现多线程应用。

风间琉璃的博客 2095

Linux C/C++编程的线程结束

线程安全退出是编写多线程程序时一个重要的事项。在Linux下,线程的结束通常由以下原因所致:(1)在线程函数中调用pthread_exit函数。(2)线程所属的进程结束了,比如进程调用了exit。(3)线程函数执行结束后返回(return)了。(4)线程被同一进程中的其他线程通知结束或取消。第1种方式,与Windows下的线程退出函数ExitThread不同,pthread_exit不会导致C++对象被析构,所以可以放心使用。

夏天又到了的专栏 1071

《Linux C/C++服务器开发实践》之第3章 多线程基本编程

Linux C/C++ 多线程 线程池

yxqq378287007的博客 337

【Linux/C++多线程篇(一) 】多线程编程入门:从核心概念到常用函数详解

本文介绍了多线程编程的基础知识和实践应用。详细讲解了linux系统编程中多线程的实现方法,包括线程创建(pthread_create)、线程号获取(pthread_self)、线程退出(pthread_exit)、资源回收(pthread_join)和线程分离(pthread_detach)等核心函数的使用。文章还通过一个实际案例展示了如何用多线程实现文件分块拷贝功能,并探讨了主线程退出对分离线程的影响及解决方案。

2501_93095927的博客 4606

从入门到精通:C语言Linux编程指南

C语言是一种通用的高级编程语言,由美国贝尔实验室的Dennis Ritchie在1972年至1973年间为了编写Unix操作系统而开发出来。C语言凭借其简洁、高效、跨平台等特点,成为了一种广泛应用的编程语言。C语言既具备高级语言的抽象能力,也具备低级语言的操作硬件的能力。同时,C语言的语法简单,易于学习,且具有很强的灵活性,适用于编写多种类型的软件。C语言还具有广泛的应用领域,包括系统软件、游戏开发、嵌入式开发、科学计算、图像处理、数据库管理等等。在Linux操作系统中,C语言是一种非常重要的编程语言。

qq_61552113的博客 5342
上一篇: qt表格模型视图
柯南大夫
博客等级 码龄9年 32粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值