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

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

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

线程的基本概念

​ 在我们目前的现代操作系统大多数支持多线程的概念,每个进程中至少有一个线程,所以即使没有使用多线程编程技术,进程也含有一个主线程。也就是说,CPU中执行的是线程,线程是程序的最小执行单位,是操作系统分配CPU时间的最小实体。

​ 一个线程的执行是由主线程开始的,如果需要可以在程序的任何地方开辟新的线程,其他线程都是由主线程创建。

线程和进程的关系

​ 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。

​ 线程可与属于同一进程的其他线程共享进程所拥有的全部资源,但是其本身基本不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器,一组寄存器和线程栈,线程栈用于维护线程在执行代码时所需要的所有函数参数和局部变量)。

引入线程的好处

  1. 在进程内创建,终止线程比创建,终止进程要快
  2. 同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换
  3. 每个进程具有独立的地址空间,而该进程内的所有线程共享该地址空间,因此可以解决父子进程模型中子进程必须复制父进程地址空间的问题
  4. 线程对解决客户/服务器模型非常有效

使用多线程的情况

  1. 应用程序中的各任务相对独立
  2. 某些任务耗时较多
  3. 各任务有不同的优先级
  4. 一些实时系统应用

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

线程的状态

​ 一个线程从创建到结束,是一整个生命周期,它总是处于下面4个状态中的一个:

(1)就绪态

​ 线程能够运行的条件已经满足,只是在等待处理器的调度(处理器要根据调度策略来把就绪态的线程调度到处理器中运行)

(2)运行态

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

(3)阻塞态

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

(4)终止态

​ 终止态就是线程的线程函数运行结束或被其他线程取消后处于的状态。线程处于终止态后应该及时进行资源回收

线程标识

​ 句柄是用来标识线程对象的,而线程本身用ID来标识。在创建线程的时候,系统会为线程分配一个唯一的ID作为线程的标识,这个ID从线程创建开始存在,一直伴随着线程的结束才消失。通常线程创建成功后会返回一个线程ID。

多线程开发的两种方式

​ 在Linux C/C++开发环境中,通常有两种方式来开发多线程程序,一种是利用POSIX多线程API函数来开发多线程程序,另外一种是利用C++自带线程类来开发多线程程序。

Linux多线程开发

  • 利用POSIX多线程API函数
  • 利用C++自带线程类

POSIX多线程API函数

常见的与线程有关的基本API函数

API函数含 义
pthread_create创建线程
pthread_exit线程终止自身执行
pthread_join等待一个线程的结束
pthread_self获取线程ID
pthread_cancel取消另一个线程
pthread_exit在线程函数中调用来退出线程函数
pthread_kill向线程发送一个信号

注:使用这些API函数,需要包含头文件pthread.h,并且在编译的时候需要加上库pthread,表示包含多线程库文件

C++11中的线程类

​ C++11新标准中引入了5个头文件来支持多线程编程,分别是atomic, thread, mutex, condition_variablefuture

  • **atomc: **该头文件主要声明了两个类,std::atomic和std::atomic_flag,另外还声明了一套C风格的原子类型和与C兼容的原子操作的函数
  • thread: 该头文件主要声明了类std::thread,另外std::this_thread命名空间也在该头文件中
  • mutex: 该头文件主要声明了与互斥锁(mutex)相关的类,包括std::mutex系列类,std::lock_guard,std::unique_lock,以及其他的类型和函数
  • condition_variable: 该头文件主要声明了与条件变量相关的类,包括std::condition_variable和std::condition_variable_any
  • future: 该头文件主要声明了std::promise和std::package_task两个Provider类,以及std::future和std::shared_future两个Future类,另外还有一些与之相关的类型和函数,std::async函数就声明在该头文件中

类std::thread的常用成员函数

成员函数说明(public 访问方式)
thread构造函数,有4种构造函数
get_id获得线程ID
joinable判断线程对象是否可连接的
join等待线程结束,该函数是阻塞函数
native_handle用于获得与操作系统相关的原生线程句柄(需要本地库支持)
swap线程交换
detach分离线程

相关文章:

  • C语言内存讲解-详说内存分布和heap空间
  • SpringBoot电商项目前后端界面搭建
  • Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife
  • 【C++学习】string的使用
  • WeMos Mini ESP32-S2FN4R2介绍
  • Halcon图像分割总结
  • 5 h0255. 迷宫问题,6 h0253. 鸣人和佐助(广度优先搜索)
  • 《数据结构》堆栈(铁路、洗牌、汉诺塔、走迷宫)全解析
  • 基于时序行为的协同过滤推荐算法(Python)
  • Vue--》计算属性与监视(侦听)属性的使用
  • 【状语从句练习题】because / because of / although / in spite of
  • Web前端开发基础教程二
  • MyBatis-写分页的几种方法,怎么写分页最简单
  • 狗厂员工来面试本想难为一下,结果被虐得连console.log也不敢写了
  • Pytorch(Tensor)-Numpy(ndarrays) API对照表
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Django 博客开发教程 8 - 博客文章详情页
  • Java读取Properties文件的六种方法
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • redis学习笔记(三):列表、集合、有序集合
  • vagrant 添加本地 box 安装 laravel homestead
  • vue中实现单选
  • 关于 Cirru Editor 存储格式
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 因为阿里,他们成了“杭漂”
  • 智能合约开发环境搭建及Hello World合约
  • RDS-Mysql 物理备份恢复到本地数据库上
  • #QT(TCP网络编程-服务端)
  • #数学建模# 线性规划问题的Matlab求解
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)ssm高校实验室 毕业设计 800008
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET简谈设计模式之(单件模式)
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • @html.ActionLink的几种参数格式
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [ 数据结构 - C++] AVL树原理及实现
  • [Android]Tool-Systrace
  • [Asp.net mvc]国际化
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [go 反射] 进阶
  • [HNOI2008]玩具装箱toy
  • [ICCV2017]Neural Person Search Machines
  • [iOS]-UIKit