go语言学习4--并发

2020-07-09 00:00:00 多个 执行 代码 并发 临界
  • 并发和并行

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才能进入该临界区

相关文章