dongyishe6689 2017-01-17 01:25
浏览 38

为什么此Go程序未按预期进入死锁状态?

I am a newbie in Go, i wrote this code and hope it will enter deadlock status, but failed.

var mux sync.Mutex

func main() {
    runtime.GOMAXPROCS(1)
    for i := 0; i < 3; i++ {
    go func() {
        log.Println("Trying to Lock the Mux")
        mux.Lock()
        log.Println("The mux is Locked")
    }()
  }
  runtime.Gosched()
}
//Output:
//2017/01/17 08:59:42 Trying to Lock the Mux
//2017/01/17 08:59:42 The mux is Locked
//2017/01/17 08:59:42 Trying to Lock the Mux
//2017/01/17 08:59:42 Trying to Lock the Mux

As you can see. this code run well and print something and then quit without any deadlock error. For I know, the first go func(){} goroutine has returned and locked the mux then quit. But the other two goroutines will be blocked because the mux has already blocked.

The function runtime.Gosched() should push the main goroutine to the only FIFO queue(runtime.GOMAXPROCS(1)) right? why it can be excute before the left two goroutine that already in the queue?

BTW,this following code will return the deadlock error as expected

var mux sync.Mutex

func main() {
    runtime.GOMAXPROCS(1)
    var wg sync.WaitGroup
    wg.Add(3)
    for i := 0; i < 3; i++ {
        go func() {
            defer wg.Done()
            log.Println("Trying to Lock the Mux")
            mux.Lock()
            log.Println("The mux is Locked")

        }()
    }
    wg.Wait()
}

Thanks!

  • 写回答

2条回答 默认 最新

  • dougua2309 2017-01-17 02:54
    关注

    For your code:

    var mux sync.Mutex
    
    func main() {
        runtime.GOMAXPROCS(1)
        for i := 0; i < 3; i++ {
        go func() {
            log.Println("Trying to Lock the Mux")
            mux.Lock()
            log.Println("The mux is Locked")
        }()
      }
      runtime.Gosched()
    }
    

    There is no deadlock, for

    func (m *Mutex) Lock()

    Lock locks m. If the lock is already in use, the calling goroutine blocks until the mutex is available.

    So the second and third goroutine just wait there. This is busy waiting. then the main goroutine exit, so the second and third goroutine also exist.

    评论

报告相同问题?

悬赏问题

  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大