跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • go 问题请教,想问下下面的代码为啥会导致死锁,导致的死锁如何解决
未分類
28 12 月 2020

go 问题请教,想问下下面的代码为啥会导致死锁,导致的死锁如何解决

go 问题请教,想问下下面的代码为啥会导致死锁,导致的死锁如何解决

資深大佬 : zhengdai1990 7

package main

import (“math/rand”; “time”)

const R = 100 // number of readers const W = 10 // number of writers

var done chan bool

func db(reads chan chan int, writes chan int) { state := <- writes for { select { case reply := <-reads: reply <- state case state = <-writes: } } } func main() { reads, writes, done := make(chan chan int), make(chan int), make(chan bool) go db(reads, writes) for r := 0; r < R; r++ { // create R readers go func() { reply := make(chan int) for i := 0; i < 20; i++ { reads <- reply // stops in one out of 10 cases if rand.Intn(10) == 0 {select{}} else {<- reply} time.Sleep(time.Millisecond) } }() } for w := 0; w < W; w++ { // create W writers go func() { for i := 0; i < 20; i++ { writes <- rand.Int() % 100 time.Sleep(time.Millisecond) } done <- true }() } for k := 0; k < W; k++ {<- done} // wait for writers to terminate }

大佬有話說 (11)

  • 資深大佬 : barbery

    本来想尝试解答一下,点进来看到代码。。。

  • 資深大佬 : caryqy

    https://play.golang.org/ 代码在这里粘贴然后分享出来

  • 資深大佬 : whitehack

    本来想尝试解答一下,点进来看到代码。。。

  • 資深大佬 : rimutuyuan

    本想复制到 IDE 里格式化一下,但因为有注释并且没换行。。。。

  • 主 資深大佬 : zhengdai1990

    @caryqy https://play.golang.org/p/y_9-OQPwfsf 大佬看下

  • 主 資深大佬 : zhengdai1990

    @rimutuyuan 贴之前是有换行的……大佬看附言

  • 主 資深大佬 : zhengdai1990

    @barbery 大佬看下附言

  • 主 資深大佬 : zhengdai1990

    @whitehack 大佬看下附言

  • 主 資深大佬 : zhengdai1990

    我的理解是 reply 那个 channel 是同步的,不能光发送不接收

  • 資深大佬 : Nitroethane

    你这写的什么鸡脖玩意儿,看了半天要吐了…… 主要问题出在第 32 行,如果生成的随机数为 0 的话,goroutine 会卡在 这个 if 语句的 select 语句里。而这会引起连锁反应:因为 reply 是无缓冲的,导致第 18 行的代码被卡住,进而第 43 行的代码也被卡住,最后所有 goroutine 全都卡住了。你可以在第 31 行 和 32 行之间加一行 log.Println(“random number in reader is 0”),你就会发现,只要这一行打印出来,程序马上 deadlock 。
    虽然 channel 可以用来同步 goroutine,但是也不能这样滥用啊。好好学习下这篇文章吧 https://golang.org/ref/mem

  • 主 資深大佬 : zhengdai1990

    @Nitroethane 老师出的作业啊,天坑

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具