为了账号安全,请及时绑定邮箱和手机立即绑定

Housie 计划中的僵局。生产者-消费者模式

Housie 计划中的僵局。生产者-消费者模式

Go
ITMISS 2021-09-27 20:41:26
我正在尝试实现一个 housie 游戏,其中一个 goroutine 生成数字,其他 3 个 goroutine 检查这些是否在它们的令牌中,并通知生产者是否生成了所有数字。我已经通过以下方式在 golang 中实现了它。这会导致死锁。知道为什么会这样吗?这是一个“作业问题”,我只是在 go 中实施它以更好地学习。package mainimport (    "fmt"    "math/rand")type PersonID intfunc contains(s []int, e int) bool {    for _, a := range s {        if a == e {            return true        }    }    return false}func Person(called_number chan int, claim_prize chan PersonID, received chan bool, coupon []int, person_id PersonID) {    numFound := 0    for i := 0; i < len(coupon); i++ {        current_number := <-called_number        found := contains(coupon, current_number)        if found {            numFound++        }        if numFound == len(coupon) {            claim_prize <- person_id        } else {            received <- true        }    }}func main() {    var called_number chan int    var claim_prize chan PersonID    var received chan bool    tokens := make([][]int, 3)    for i := 0; i < 3; i++ {        tokens[i] = make([]int, 12)        for j := 0; j < 12; j++ {            num := rand.Intn(100) + 1            found := contains(tokens[i], num)            for found {                num = rand.Intn(100) + 1                found = contains(tokens[i], num)            }            tokens[i][j] = num        }    }    go Person(called_number, claim_prize, received, tokens[0], 0)    go Person(called_number, claim_prize, received, tokens[1], 1)    go Person(called_number, claim_prize, received, tokens[2], 2)    claimants := make([]PersonID, 0)    prev_called := make(map[int]bool)    for i := 0; i < 100; i++ {        if len(claimants) == 3 {            break        }        num := rand.Intn(100) + 1        _, ok := prev_called[num]        for ok {            num = rand.Intn(100) + 1            _, ok = prev_called[num]        }  
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信