亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

并發添加節點到鏈表golang

并發添加節點到鏈表golang

Go
蝴蝶不菲 2022-12-26 16:38:38
我正在嘗試使用通道和 goroutines 同時將節點添加到鏈表中。但是,我似乎做錯了什么。這是我到目前為止所寫的內容。目前,我的打印功能只是重復第 8 個節點。這似乎適用于其他鏈接列表,所以我不完全理解這個問題。任何幫助都會很棒。這是我寫的代碼func makeNodes(ctx context.Context, wg *sync.WaitGroup, ch chan Node) {    defer wg.Done()    for i := 0; i < 9; i++ {        tmp := Node{Data: i, Next: nil}        ch <- tmp    }    <-ctx.Done()    return}type Node struct {    Data int    Next *Node}type List struct {    Head   *Node    Length int    Last   *Node}func (l *List) addToEnd(n *Node) {    if l.Head == nil {        l.Head = n        l.Last = n        l.Length++        return    }    tmp := l.Last    tmp.Next = n    l.Last = n    l.Length++}func (l List) print() {    tmp := l.Head    for tmp != nil {        fmt.Println(tmp)        tmp = tmp.Next    }    fmt.Println("\n")}func main() {    cha := make(chan Node)    defer close(cha)    ctx := context.Background()    ctx, cancel := context.WithCancel(ctx)    var wg sync.WaitGroup    wg.Add(1)    list := List{nil, 0, nil}    go makeNodes(ctx, &wg, cha)    go func() {        for j := range cha {            list.addToEnd(&j)        }    }()    cancel()    wg.Wait()    list.print()}
查看完整描述

1 回答

?
手掌心

TA貢獻1942條經驗 獲得超3個贊

該程序分配一個結構(j在for j:= range循環中)并用從通道讀取的內容重復覆蓋它。


這導致相同的變量(j位于固定內存位置)被多次添加到列表中。


考慮將通道修改為指針通道。


在main()


cha := make(chan *Node)

然后對于makeNodes() 每次創建一個新節點(通過Node{}),一個新的節點指針被放置到通道中。


func makeNodes(ctx context.Context, wg *sync.WaitGroup, ch chan *Node) {

    defer wg.Done()

    for i := 0; i < 9; i++ {

        tmp := Node{Data: i, Next: nil}

        ch <- &tmp

    }

    <-ctx.Done()

    return

}

下面將正確地將每個唯一的 Node 指針添加到列表中。


go func() {

    for j := range cha {

        list.addToEnd(j)

    }

}()

此外,您可能會發現并非所有實體都會進入列表或從頻道中讀取。您用于同步生產者 ( makeNodes()) 和消費 ( for j:= range) 的方法需要改進。


查看完整回答
反對 回復 2022-12-26
  • 1 回答
  • 0 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號