go语言学习4--并发
- 并发和并行
golang里的并发指的是让某个函数独立于其他函数执行的能力(goroutine运行时是相互独立的)。
并行是让多个不同的代码片段同时在不同的物理处理器上执行。
并行是同时做很多事情,并发是同时管理很多事情。
- goroutine
- waitgroup
- waitgroup.add(int)
需要运行的goroutine数量
- waitgroup.done()
标识一个goroutine运行结束
- waitgroup.wait()
等待所有goroutine运行结束
- 多个goroutine同时并发运行时,如果当前执行的goroutine占用逻辑处理器时间过长,调度器会暂停当前执行的goroutine并切换到其他goroutine执行,其他goroutine执行结束或执行其他goroutine一定时间之后,调度器会切换回暂停的goroutine继续执行。
- Runtime.GOMAXPROCS(1)/runtime.GOMAXPROCS(runtime.NumCPU)
- GOMAXPROCS()函数可以为可用的物理处理器(CPU)创建逻辑处理器
- Runtime.Gosched()
- 当前goroutine从线程退出,并放回到队列
- 竞争状态
- 如果两个或多个goroutine在没有相互同步的情况下,访问某个共享资源,并试图同时读和写这个资源,就处于相互竞争的状态。
- 对一个共享资源的读和写操作必须是原子化的。
- 资源锁
- 传统同步goroutine机制,就是对共享资源加锁。
- 原子函数
- 原子函数能以很底层的加锁机制来同步访问整型变量和指针。
- atomic.AddInt64(&num,n)为int64类型整型数值安全的增加n(串行增加)
- atomic.LoadInt64(&num) 取出int64类型整型的值
- atomic.StoreInt64(&num,n)为int64类型整型数值赋值为n
- 互斥锁
- 互斥锁用于在代码上创建一个临界区,保证同一时间只有一个goroutine能够访问临界区的代码
- sync.Mutex---->mutex.Lock(){代码块}----->mutex.Unlock()
- 当一个goroutine进入临界区,并在临界区代码块执行过程中强制退出当前线程(runtime.Gosched()),调度器会字词分配这个goroutine进入线程继续运行,直到该goroutine执行Unlock()释放代码块,其他goroutine才能进入该临界区
相关文章