首页 > 解决方案 > 在 goroutine 中设置广播和多接收

问题描述

我正在尝试在 Go 中模拟Ben-Or 算法,但我无法弄清楚如何在多个 goroutine 之间广播和接收消息。

我为每个处理器实现了一个不同的 goroutine (SimulateOneProc),并希望为每个处理器发送一条消息。然后处理器从所有其他处理器(包括它自己)接收发送的消息并继续。

func SimulateBenOr(n, t int) {
    processes := initProcesses(n)
    messages := make(chan Message)
    ratifier := make(chan Message)

    for i := range processes {
        go simulateOneProc(n, t, processes[i], messages, ratifier)
    }
    fmt.Scanln()
}

func simulateOneProc(n, t int, process Process, messages chan Message, ratifier chan Message) {
        fmt.Println("starting round", process.round, "for processor", process.id)
        var message1 Message
        message1.pref = process.pref
        message1.round = process.round

        // send this process's preference and round
        go func(message1 Message, messages chan Message) {
            for i := 1; i <= n; i++ {
                fmt.Println("sending message", process.pref, "from processor", process.id)
                messages <- message1
            }
        }(message1, messages)

        // wait for n-t messages
        for i := 1; i <= n; i++ {
            newMessage := <-messages
            fmt.Println("recieved message", newMessage.pref, "by processor", process.id)
            }
}

我尝试为每个处理器使用一个发送和 n 个接收,但这不起作用。我尝试发送和接收 n 次,但这会导致特定处理器多次接收同一消息,而其他一些接收则为空。做这个的最好方式是什么?我是并行编程的初学者,所以对于我所犯的任何基本错误,我深表歉意。

标签: algorithmgoconcurrency

解决方案


推荐阅读