>  기사  >  백엔드 개발  >  홀수와 짝수를 번갈아 인쇄하는 고루틴이 교착 상태에 빠졌습니다.

홀수와 짝수를 번갈아 인쇄하는 고루틴이 교착 상태에 빠졌습니다.

王林
王林앞으로
2024-02-13 16:00:101151검색

交替打印奇数和偶数的 goroutine 陷入死锁

"홀수와 짝수를 번갈아 인쇄하는 고루틴이 교착 상태에 빠졌습니다."는 동시 프로그래밍에서 흔히 발생하는 문제입니다. 동시 작업에 고루틴을 사용할 때 올바른 동기화 메커니즘이 없으면 쉽게 교착 상태가 발생할 수 있습니다. 교착 상태는 둘 이상의 프로세스(또는 고루틴)가 서로 리소스를 해제하기를 기다리고 있기 때문에 계속 실행할 수 없는 상태입니다. 이 기사에서는 이 문제의 원인을 소개하고 개발자가 동시 프로그래밍의 교착 상태 문제를 더 잘 이해하는 데 도움이 되는 솔루션을 제공합니다.

질문 내용

저는 현재 golang을 배우고 있습니다. golang 채널이 어떻게 작동하는지 확인하고 싶습니다. 저는 두 개의 고루틴이 홀수와 짝수를 교대로 인쇄하는 프로그램을 만들었습니다. 프로그램이 올바르게 인쇄하더라도 마지막에는 여전히 교착 상태 오류가 표시됩니다. 오류 메시지에는 이 문제의 원인이 명확하지 않습니다.

으아아아

[편집] 답장을 보내주셔서 감사합니다. 문제를 해결하기 위해 다음 코드를 작성했습니다.

func main() {
    even := make(chan bool)
    odd := make(chan bool)
    go func() {
        defer close(odd)
        for i := 0; i <= 10; i += 2 {
            <-even
            print("even ====>")
            println(i)
            odd <- true
        }
    }()
    var wait sync.waitgroup
    wait.add(1)
    go func() {
        for i := 1; i <= 10; i += 2 {
            _, ok := <-odd
            if !ok {
                wait.done()
                return
            }
            print("odd ====>")
            println(i)
            even <- true
        }
    }()
    even <- true
    wait.wait()
}

Solution

이 문제는 다음과 같은 방법으로 해결할 수 있습니다

  1. cap의 두 번째 gofunc을 제거합니다(라인 20)
  2. selecting 写入 even(28행)

위 내용은 홀수와 짝수를 번갈아 인쇄하는 고루틴이 교착 상태에 빠졌습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제