Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa saya tidak dapat melihat output jika saya tidak tidur pada penghujungnya?

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

WBOY
WBOYke hadapan
2024-02-06 11:21:03713semak imbas

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)
}

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)

(当然,从工作人员中删除 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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam