基本概念
进程/线程
进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位
线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位
一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行
并发/并行
多线程程序在单核心的cpu上运行,称为并发;多线程程序在多核心的CPU上运行,称为并行
并发与并行并不相同,并发主要由切换时间片来实现“同时”运行,并行则是利用多核实现多线程的运行,Go程序可以设置使用核心数,以发挥多核计算机的能力
协程/线程
协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的
线程:一个线程上可以跑多个协程,协程是轻量级的线程
1、协程Coroutine
简介
1.协程是一种轻量级的“线程”
2.协程是非抢占式的多任务处理,由协程内部主动交出控制权
3.协程是编译器/解释器/虚拟机层面的多任务(不是操作系统层的多任务,操作系统只有线程,没有协程,go语言中可以看做是编译器级别的多任务,编译器会把go function解释成一个协程,具体执行上go语言有一个调度器,用来调度协程,)
4、多个协程可能在一个或者多个线程上运行(由调度器来决定的)
5、go语言协程中若有io操作则会进行协程间的切换(因为io操作会有等待的过程)
数据访问冲突检测命令
数据访问冲突检测:
go run -race file_name.go
goroutine
func main(){
var a [10]int
for i := 0; i < 10; i++ {
//定义一个
go func(i int){
a[i]++
}(i)
}
time.Sleep(time.Millisecond)
fmt.Println(a)
}
goroutine可能切换的点
下方只是参考,不能保证切换,不能保证在其他地方不切换
1、I/O(fmt.Println(“xx”))、select
2、channel
3、等待锁
4、函数调用(有时会切换,由调度器决定)
5、手动交出控制器:runtime.Gosched()
2、抢占式和非抢占式区别
go语言的协程会在io操作时进行协程的切换(因为io操作会有等待的过程)