死锁的演示程序--Go

作者:guoxj
浏览:532

死锁的几个必要条件

  • 互斥
  • 循环等待
  • 不剥夺
  • 持有并等待
package main

import (
  "sync"
  "fmt"
  "time"
)

type value struct {
  mu sync.Mutex
  value int
}

func main() {
  fmt.Println("The program starts now!")
  var wg sync.WaitGroup
  printSum := func(v1, v2 *value) {
    defer wg.Done()
    v1.mu.Lock()
    defer v1.mu.Unlock()

    // 下方的睡眠时间几乎保证了两个 goroutine 可以交叉对 a 和 b 两个变量进行锁定
    // 从而导致死锁
    time.Sleep(2 * time.Second)
    v2.mu.Lock()
    defer v2.mu.Unlock()

    fmt.Printf("sum=%v\n", v1.value + v2.value)
  }

  var a, b value
  wg.Add(2)
  go printSum(&a, &b) // 先锁定 a 等待后锁定 b
  go printSum(&b, &a) // 先锁定 b 等待后锁定 a
  wg.Wait()
  fmt.Println("The program ends now!")
}

 




登录后回复

共有0条评论