Go语言并发编程之道读书笔记第一二章

218 阅读2分钟

并发中的一些概念的介绍

临界区

程序需要独占访问共享资源的部分

死锁

死锁程序是所有并发进程彼此等待的程序。如下例子,启动的两个协程互相等待对方的锁释放。实际上出现死锁有几个必要的条件。

  1. 相互排斥:并发进程同时拥有资源的独占权。
  2. 等待条件:并发进程必须同时拥有一个资源,并等待额外的资源。
  3. 没有抢占:并发进程拥有的资源只能被该进程释放。
  4. 循环等待:一个并发进程(P1)必须等待一些列其他并发进程(P2),同时P2进程也在等待P1进程。

上述四个条件,只要有一个不满足,就不能造成死锁。

type value struct {
    mu   sync.Mutex
    data int
}
var wg sync.WaitGroup
printSum := func(v1, v2 *value) {
        defer wg.Done()
        v1.mu.Lock()
        defer v1.mu.Unlock()
        time.Sleep(2 * time.Second)
        v2.mu.Lock()
        defer v2.mu.Unlock()
        fmt.Printf("sum=%v\n", v1.data+v2.data)
}

var a, b value
wg.Add(2)
go printSum(&a, &b)
go printSum(&b, &a)
wg.Wait()

活锁

活锁是正在主动执行并发操作的程序,但是这些操作无法向前推进程序的状态。(简单的例子,海贼王中,艾斯遇到蜥蜴挡路,谁也不让谁)。

饥饿

饥饿是在任何情况下,并发进程都无法获得执行工作所需的所有资源。

并发与并行的区别

一:

  1. 并发是指一个处理器同时处理多个任务。
  2. 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
  3. 并发是逻辑上的同时发生(simultaneous)。

二:

  1. 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。
  2. 并行是物理上的同时发生,从微观还是从宏观来看,二者都是一起执行的。

搜集到的更详细的资料

  1. 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态.这种方式我们称之为并发(Concurrent)。

  2. 当系统有一个以上CPU时,则线程的操作有可能非并发.当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。

image.png

CSP概念介绍

CSP全称:Communication Sequential Processes, 通信顺序进程,),既是个技术名词,也是介绍这种技术的论文的名字。在1978年, Charles Antony Richard Hoare 在Association for Computing Machinery(一般被称作ACM)中发表的论文。