• 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分离线程
  • 相关阅读:
    2059. 转化数字的最小运算数-队列+广度优先遍历
    如何进行性能评估
    司空见惯 - 车载指南针拆解
    matlab去除图片上的噪声
    spring+redis docker
    C/C++特殊求和 2021年6月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
    算法通关村第18关【黄金】| 继续回溯
    ROS自学笔记十八:ModuleNotFoundError: No module named ‘serial‘
    新型智慧公厕建设:引领公厕行业的未来!
    6个步骤强化 CI/CD 安全
  • 原文地址:https://blog.csdn.net/weixin_51958878/article/details/127714124