我正在尝试实现一个 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
提交
取消