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

我正在尝试实现一个 housie 游戏,其中一个 goroutine 生成数字,其他 3 个 goroutine 检查这些是否在它们的令牌中,并通知生产者是否生成了所有数字。我已经通过以下方式在 golang 中实现了它。这会导致死锁。知道为什么会这样吗?这是一个“作业问题”,我只是在 go 中实施它以更好地学习。


package main


import (

    "fmt"

    "math/rand"

)


type PersonID int


func 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]

        }

  

ITMISS
浏览 227回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go