zoukankan      html  css  js  c++  java
  • 学习笔记 多线程

    学习来源:《程序员的自我修养》

    1. 页映射模式下,CPU发出的是Virtual Address,。经过MMU(Memory Management Unit)进行也映射,转换成了Physical Address

    2.多线程中的私有与共享:

    3.线程状态切换:

    实际中,Running到Ready状态还有yeild()方法可以触发,另外有一种状态是阻塞状态(包括等待状态【由wait()触发】,被notify()后进入锁定阻塞态,锁被释放后进入就绪了,普通的阻塞是由sleep()引起)

    (1)关于优先级:频繁进入等待状态的线程由于不“霸占”CPU,具有更高的优先级提升,因此I/O密集型比CPU密集型线程更容易得到优先级提升

    (2)任何一条语句在指令层级都被拆分为多条指令,因此在多线程时候容易产生不一致的问题,此时引入单指令操作即原子操作

    4. fork函数产生一个和当前进程完全一样的新进程,和原任务共享一个内存空间,写时复制(Copy On Write),如果希望在使用时用新的可执行影响替换当前的,调用exec()可以

    5.可重入(Reentrant)与线程安全

      (1) 重入情况:多个线程同时执行函数;函数自身调用自身

      (2)可重入表明重入后不会产生任何不良影响,即结果可再现

      (3)可重入的特点:不使用/依赖静态或全局的非const变量;仅依赖调用方提供的参数‘不依赖单个资源的锁;不调用任何不可重入的函数

    6. 过度优化

      CPU在执行程序的时候,为了提高效率可能会出现交换指令的顺序,即在进行优化的时候,交换毫不相干的相邻指令的执行顺序

        在单线程中是没有问题的,但是在多线程中这样的顺序就使程序可能出现不同的结果

      volatile关键字:1)阻止编译器为提高速度将变量缓存到寄存器内而不写回;2)阻止编译器调整操作volatile关键字修饰的变量的指令顺序

  • 相关阅读:
    为什么你改了我还看不见?
    一条SQL更新语句是如何执行的?
    一条SQL查询语句是如何执行的?
    为什么学习mysql
    读书并不只是向一个方向前进——《代码之外的生存指南》
    RabbitMQ在C#中的使用
    RFID技术与条形码技术的对比
    射频识别技术RFID
    通过IIS不能连接远程数据库的问题
    老板不断加需求、改需求的四种应对方法
  • 原文地址:https://www.cnblogs.com/KarayLee/p/4807198.html
Copyright © 2011-2022 走看看