Mengapa saya tidak dapat melihat output jika saya tidak tidur pada penghujungnya?

WBOY
Lepaskan: 2024-02-06 11:22:09
ke hadapan
717 orang telah melayarinya

Mengapa saya tidak dapat melihat output jika saya tidak tidur pada penghujungnya?

Kandungan soalan

Kod berikut melaksanakan penggunaan dua gorout untuk mencetak elemen secara bergilir-gilir dalam senarai terpaut. Walau bagaimanapun, ia mengalami masalah yang agak pelik di mana hasil cetakan tidak dapat dilihat tanpa masa akhir. tidur. Secara teorinya, stdout tidak mempunyai penimbal. Bolehkah sesiapa memberi panduan?

import (
    "context"
    "fmt"
    "sync"
)

type ListNode struct {
    val  int
    next *ListNode
}

func NewLinkedList() (head *ListNode) {
    var cur *ListNode
    for i := 0; i < 100; i++ {
        if cur == nil {
            cur = &ListNode{val: i}
            head = cur
        } else {
            cur.next = &ListNode{val: i}
            cur = cur.next
        }
    }
    return
}

func main() {
    ll := NewLinkedList()
    wg := sync.WaitGroup{}
    var a = make(chan *ListNode, 1)
    var b = make(chan *ListNode, 1)
    ctx, cancel := context.WithCancel(context.Background())
    worker := func(name string, input, output chan *ListNode) {
        wg.Add(1)
        defer wg.Done()
        for {
            select {
            case n := <-input:
                if n == nil {
                    break
                }
                fmt.Printf("%s: %d\n", name, n.val)
                if n.next != nil {
                    output <- n.next
                } else {
                    cancel()
                    break
                }
            case <-ctx.Done():
                break
            }
        }
    }

    go worker("a", a, b)
    go worker("b", b, a)

    a <- ll
    wg.Wait()
    //time.Sleep(time.Millisecond)
}
Salin selepas log masuk

Jawapan betul

Anda mesti memanggil wg.Add(1) pada Goroutine utama kerana kaunter kumpulan tunggu ditambah sebelum 2 Goroutine yang bermula tiba sebelum main() wg.Wait() ialah senario yang sah. Jika kaunternya ialah 0, wg.Wait() tidak menyekat, main() kembali, dan oleh itu keseluruhan aplikasi ditamatkan: wg.Add(1),因为在 2 个启动的 Goroutine 增加 waitgroup 计数器之前 main() 到达 wg.Wait() 是一个有效的场景。如果其计数器为 0,则 wg.Wait() 不会阻塞,main() 返回,因此整个应用程序终止:

wg.Add(1)
go worker("a", a, b)
wg.Add(1)
go worker("a", a, b)
Salin selepas log masuk

(当然,从工作人员中删除 wg.Add(1)rrreee

(daripada pekerja, daripada kursus Alih keluar wg.Add(1) dalam

Lihat: Tempat untuk meletakkan wg.Add()

Atas ialah kandungan terperinci Mengapa saya tidak dapat melihat output jika saya tidak tidur pada penghujungnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan