• 线程是如何进行创建的


    对于任何一个进程来讲,即便我们没有主动去创建线程,进程也是默认有一个主线程的。线程是负责执行二进制指令的,它会根据项目执行计划书,一行一行执行下去。进程要比线程管的宽多了,除了执行指令之外,内存、文件系统等等都要它来管。

    进程相当于一个项目,而线程就是为了完成项目需求,而建立的一个个开发任务。默认情况下,你可以建一个大的任务,就是完成某某功能,然后交给一个人让它从头做到尾,这就是主线程。但是有时候,你发现任务是可以拆解的,如果相关性没有非常大前后关联关系,就可以并行执行。

    使用进程实现并行执行的问题也有两个。第一,创建进程占用资源太多;第二,进程之间的通信需要数据在不同的内存空间传来传去,无法共享。

    一个普通线程的创建和运行过程。

    把线程访问的数据细分成三类。

    第一类是线程栈上的本地数据,比如函数执行过程中的局部变量。

    栈的大小可以通过命令 ulimit -a 查看,默认情况下线程栈大小为 8192(8MB)。我们可以使用命令 ulimit -s 修改。

    第二类数据就是在整个进程里共享的全局数据。例如全局变量,虽然在不同进程中是隔离的,但是在一个进程中是共享的。如果同一个全局变量,两个线程一起修改,那肯定会有问题,有可能把数据改的面目全非。这就需要有一种机制来保护他们,比如你先用我再用。这一节的最后,我们专门来谈这个问题。

    这就是第三类数据,线程私有数据(Thread Specific Data),可以通过以下函数创建:

    int pthread_key_create(pthread_key_t *key, void (*destructor)(void*))

    可以看到,创建一个 key,伴随着一个析构函数。key 一旦被创建,所有线程都可以访问它,但各线程可根据自己的需要往 key 中填入不同的值,这就相当于提供了一个同名而不同值的全局变量。

    Mutex,全称 Mutual Exclusion,中文叫互斥。顾名思义,有你没我,有我没你。它的模式就是在共享数据访问的时候,去申请加把锁,谁先拿到锁,谁就拿到了访问权限,其他人就只好在门外等着,等这个人访问结束,把锁打开,其他人再去争夺,还是遵循谁先拿到谁访问。

     Mutex 的使用流程。

    写多线程的程序是有套路的。

    此文章为10月Day22学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。

  • 相关阅读:
    深度学习零基础学习之路——第一章 环境软件配置
    c语言中文件的定义
    学信息系统项目管理师第4版系列19_质量管理
    网络编程.
    高通开发系列 - ALSA声卡驱动中tinymix返回时间过慢
    【第六章】STM32 - 软件I2C读取MPU6050
    干货,分布式数据库在金融核心场景的落地实践|腾讯云数据库
    『手撕Vue-CLI』添加自定义指令
    多题库查题、独立后台、响应速度快、全网平台可查、功能最全!
    【java】【MyBatisPlus】【四】【完】MyBatisPlus一些实战总结(枚举、翻页、sql、组合条件、自增主键、逻辑删除)
  • 原文地址:https://blog.csdn.net/key_3_feng/article/details/133976971