zoukankan      html  css  js  c++  java
  • 廖雪峰的多线程 1

    现代操作系统(Windows,macOS,Linux)都可以执行多任务。多任务就是同时运行多个任务,例如:

    CPU执行代码都是一条一条顺序执行的,但是,即使是单核cpu,也可以同时运行多个任务。因为操作系统执行多任务实际上就是让CPU对多个任务轮流交替执行。

    例如,假设我们有语文、数学、英语3门作业要做,每个作业需要30分钟。我们把这3门作业看成是3个任务,可以做1分钟语文作业,再做1分钟数学作业,再做1分钟英语作业:
    这样轮流做下去,在某些人眼里看来,做作业的速度就非常快,看上去就像同时在做3门作业一样

    类似的,操作系统轮流让多个任务交替执行,例如,让浏览器执行0.001秒,让QQ执行0.001秒,再让音乐播放器执行0.001秒,在人看来,CPU就是在同时执行多个任务。

    即使是多核CPU,因为通常任务的数量远远多于CPU的核数,所以任务也是交替执行的。


    进程
    在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。
    某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。
    进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个线程。

    操作系统调度的最小任务单位其实不是进程,而是线程。常用的Windows、Linux等操作系统都采用抢占式多任务,如何调度线程完全由操作系统决定,程序自己不能决定什么时候执行,以及执行多长时间。
    因为同一个应用程序,既可以有多个进程,也可以有多个线程,因此,实现多任务的方法,有以下几种:
    多进程模式(每个进程只有一个线程):

    多线程模式(一个进程有多个线程):

    多进程+多线程模式(复杂度最高):

    穿插看go语言的多线程代码:

    package main
     
    import (
     
    "fmt"
     
    "time"
     
    )
     
    func printString(value string) {
     
    for i := 0; i < 10; i++ {
     
          fmt.Println(value)
     
          time.Sleep(time.Second) //0.1 second
     
          }
     
    }
     
    func main() {
     
          go printString("A")
     
          go printString("B")
     
     
          time.Sleep(time.Second * 10)//暂时挂起主线程,让goroutine的两个线程跑完
     
    }
    
    

    输出结果:ABABBAABABBABABAABAB
    两个线程交叉输出,说明是以并发形式执行,这里为什么说是并发而不是并行,因为go语言默认是单核执行线程。如果想要多核并行执行,需要在启动goroutine之前首先调用以下语句配置cpu核数:
    runtime.GOMAXPROCS()
    自从Go 1.5开始, Go的GOMAXPROCS默认值已经设置为 CPU的核数,我们不用手动设置这个参数。


  • 相关阅读:
    [LeetCode] 55. Jump Game 跳跃游戏
    [LeetCode] 163. Missing Ranges 缺失区间
    [LeetCode] 228. Summary Ranges 总结区间
    获取当时时间和日期
    响应式布局设备分界点
    html5shiv.js分析-读源码之javascript系列
    建站模板开源代码
    js 调试问题
    transform使用参考指南
    浏览器版本过低
  • 原文地址:https://www.cnblogs.com/ukzq/p/13413199.html
Copyright © 2011-2022 走看看