마지막에 잠을 자지 않으면 왜 출력을 볼 수 없나요?

WBOY
풀어 주다: 2024-02-06 11:22:09
앞으로
717명이 탐색했습니다.

마지막에 잠을 자지 않으면 왜 출력을 볼 수 없나요?

질문 내용

다음 코드는 연결된 목록의 요소를 교대로 인쇄하기 위해 두 개의 고루틴을 사용하는 방법을 구현합니다. 그러나 최종 시간이 없으면 인쇄된 결과가 보이지 않는 다소 이상한 문제가 발생합니다. 잠. 이론적으로 stdout에는 버퍼가 없습니다. 누구든지 지침을 제공할 수 있습니까?

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)
}
로그인 후 복사

정답

기본 고루틴에서 wg.Add(1)를 호출해야 합니다. 대기 그룹 카운터는 main() 전에 시작된 2개의 고루틴이 도착하기 전에 증가하기 때문입니다. wg.Wait()는 유효한 시나리오입니다. 카운터가 0이면 wg.Wait()가 차단되지 않고 main()이 반환되므로 전체 애플리케이션이 종료됩니다. 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

(작업자로부터, of 과정

에서 wg.Add(1)를 제거하세요. wg.Add()를 배치할 위치

위 내용은 마지막에 잠을 자지 않으면 왜 출력을 볼 수 없나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿