• Linux:线程安全,多线程的应用


    线程安全

    在多线程中,除了同步外,还要使用线程安全的函数。
    用什么方法保证线程安全:能保证线程的正确性

    1. 同步
    2. 使用线程安全的函数
      下面来看一段代码:引出线程安全的相关概念,在主线程中创建一个子线程,用子线程来分割一个字符串,主线程也来分割一个字符串,主线程和子线程分别打印自身分割的结果(各自打印各自的)

      运行结果:
      从上面的结果可以发现:静态变量和全局变量只有一份,子线程和主线程都要用这份空间,都需要记住自己当前的分割位置(而只能记住一个地址的位置),但是位置又不一样,一旦当后者把前者覆盖掉,则会丢失前者的内容。所以只能对后者进行分割。得出:strtok()不能在多线程环境中使用,则可以用可重入函数(线程安全的函数)strtok_r

      运行结果:**
      **总结:**无论多线程程序如何调度,都能得到正确的一致的结果,则认为它处于线程安全的状态。
      2 思考:在多线程中执行fork,不管在哪一个线程中执行,fork后会产生一个子进程,那么这个子进程会有多少条执行路径呢?多线程程序执行fork结果如何?下面来看一段代码:
      运行结果:

      可以发现只有一条执行路径,接下来在主线程中执行命令fork,

      运行结果:
      接下来将fork添加到子线程函数中:
      运行结果:

      多线程程序fork后,子进程只有一条执行路径。就是fork所在的执行路径。
      3 如果在多线程中用到了锁,但是又执行了fork,产生子进程。那么如何使用锁?在子进程和父进程中用到的锁是同一个吗?


      运行结果:

      从上面的结果可以看出:子进程并未加锁成功,由于子进程未退出,主进程阻塞了,线程实现了加锁和解锁,正常结束。父子进程用的不是同一个锁(若是一个锁,线程解锁,则子进程应该也加锁成功了),fork时,锁也被复制了,连同锁的状态也跟着被复制了。说明在子进程中初始状态就是加锁状态,因此无法加锁。下面进行修改,在fork之前加锁,若当前无人用锁则会加锁成功。


      运行结果:

      4 多线程的应用
      生产者与消费者
    3. 生产者和消费者必须互斥的使用缓冲区
    4. 缓冲区空时,消费者不能读取数据
    5. 缓冲区满时,生产者不能添加数据

      下面用代码来实现:

      运行结果:一共会打印60个数据。
  • 相关阅读:
    SSM+网上书城系统 毕业设计-附源码180919
    分布式事务两阶段提交和三阶段提交有什么区别?
    Autosar诊断实战系列24-0x2E服务代码级分析及ECU-Pending期间的处理
    Go 通道机制与应用详解
    操作系统(一)概述&基本组成&运行机制
    k8s教程(13)-pod定向调度
    Milvus的索引方式
    scala的schema函数(算子)
    前端经典面试题 | 性能优化之图片优化
    【ML】cheatsheet
  • 原文地址:https://blog.csdn.net/weixin_58368590/article/details/125508521