Deadlock

1. Channel block

c:=make(chan int)
c<-118  // 會一直阻塞, 直到出現消費者. 無容量的chan 是同步的
fmt.Println(<-c)

解法

// 方法一
c := make(chan int)
go func(){
    c <- 118
}()
fmt.Println(<-c)

// 方法二
c := make(chan int, 1)
c <- 118
fmt.Println(<-c)

2. Sync.Mutex

// 第一個已經lock a 然後要去lock b
// 第二個已經lock b 然後要去lock a
type value struct{
    mu sync.Mutex
    value 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.Println("sum = %v \n", v1.value + v2.value)
}

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

3. sync.Once

// <1>調用的Do 直到<2>調用Do並退出才會繼續
var onceA, onceB sync.Once
var initB func()
initA := func(){ 
    onceB.Do(initB)
}
initB = func(){    // <1>
    onceA.Do(initA)
}
onceA.Do(initA)                    // <2>
© Kimi Tsai all right reserved.            Updated : 2023-07-12 09:04:54

results matching ""

    No results matching ""

    results matching ""

      No results matching ""