请认真回答以下问题:
1、为啥输出结果不固定?会出现死锁吗?会一直运行下去吗?
2、第10行代码打开后,请写出输出结果?
3、将第25行代码注释后,打开第10行代码,程序可以输出什么?为什么?
4、第10行代码打开,将第14行代码与第15行代码互换后,会影响结果输出吗?那输出结果会是什么呢?
您需要 登录 才可以下载或查看,没有账号?立即注册
举报
package main import ( "time" "fmt" ) func main() { ch := make(chan struct{}, 1) // ch <- struct{}{} //有1个缓冲可以用,无需阻塞,可以立即执行 go func() { //子协程1 fmt.Println("1111----lock") time.Sleep(2 * time.Second) //sleep一个很长的时间 <-ch fmt.Println("1") }() ch <- struct{}{} //由于子协程1已经启动,寄希望于子协程1帮自己解除阻塞,所以会一直等子协程1执行结束。如果子协程1执行结束后没帮自己解除阻塞,则希望完全破灭,报出deadlock go func() { //子协程2 fmt.Println("22222----lock") time.Sleep(3 * time.Second) fmt.Println("2") <-ch }() ch <- struct{}{} // close(ch) }
package main import ( "fmt" "sync" "time" ) func main() { wg := sync.WaitGroup{} wg.Add(1) go func() { //子协程1 fmt.Println("1111----lock") time.Sleep(2 * time.Second) //sleep一个很长的时间 wg.Done() fmt.Println("1") }() wg.Add(1) //由于子协程1已经启动,寄希望于子协程1帮自己解除阻塞,所以会一直等子协程1执行结束。如果子协程1执行结束后没帮自己解除阻塞,则希望完全破灭,报出deadlock go func() { //子协程2 fmt.Println("22222----lock") time.Sleep(3 * time.Second) fmt.Println("2") wg.Done() }() wg.Wait() } 运行结果: 22222----lock 1111----lock 1 2
本版积分规则 发表回复 回帖后跳转到最后一页
Archiver|手机版|小黑屋|学习笔记
GMT+8, 2024-12-21 19:54 , Processed in 0.029795 second(s), 13 queries , APCu On.
Powered by Discuz! X3.5
© 2001-2024 Discuz! Team.