这怎么算是死锁了呢?

摘自:https://talks.golang.org/2013/advconc.slide#8

 
package main

import "fmt" import "time" type Ball struct{ hits int } func main() { table := make(chan *Ball) go player("ping", table) go player("pong", table) // table <- new(Ball) // game on; toss the ball 原文中把这行注掉,这个程序就被演示成deadlock了, time.Sleep(1 * time.Second) <-table // game over; grab the ball } func player(name string, table chan *Ball) { for { ball := <-table ball.hits++ fmt.Println(name, ball.hits) time.Sleep(100 * time.Millisecond) table <- ball } }

我理解 = <-table 就像消息队列一样,阻塞在这里等待消息,等sleep结束后,大不了三个 <- 都卡住,何谈deadlock ?

共 2 个回复


perki

当然死锁啊,主线程阻塞在13行,两个go 协程 阻塞在17行,程序无法进行,也无法停止!

# 0

beerspume

确实不能叫死锁 [死锁一般是指多个进程(/线程)相互拥有且不释放对方需要的资源] 而你这个只是被阻塞了,并且永远不会通过而已。类似于无限循环

# 1