Go 동시성과 채널 혼란
문제
사용자가 Go 동시성을 이해하려고 합니다. 다음 코드 조각을 사용하는 채널:
<code class="go">package main import "fmt" func display(msg string, c chan bool) { fmt.Println("display first message:", msg) c <- true } func sum(c chan bool) { sum := 0 for i := 0; i < 10000000000; i++ { sum++ } fmt.Println(sum) c <- true } func main() { c := make(chan bool) go display("hello", c) go sum(c) <-c }</code>
주 함수가 채널에서 데이터를 수신하면 종료되어야 하기 때문에 예상되는 출력은 "첫 번째 메시지 표시: hello"뿐입니다. 그러나 실제 출력에는 100억 개의 숫자의 합도 포함됩니다.
답변
코드의 주요 문제는 스케줄러가 두 고루틴 중에서 자유롭게 선택할 수 있다는 것입니다. (표시 및 합계)이 차단되지 않습니다. 프로그래머는 디스플레이가 먼저 끝나고 합계가 완료되기 전에 채널에 데이터를 보낼 것으로 기대하지만 스케줄러의 비결정적 특성으로 인해 이러한 일이 발생하지 않을 수도 있습니다.
한 가지 가능한 실행 시나리오:
이 문제를 해결하고 "첫 번째 메시지 표시: hello" 메시지가 독점적으로 인쇄되도록 하기 위한 한 가지 접근 방식은 결과 채널을 사용하여 디스플레이에서 메시지를 수신하고 프로그램을 즉시 종료하는 것입니다. 수정된 주요 기능은 다음과 같습니다:
<code class="go">func main() { result := make(chan string) go display("hello", result) fmt.Println(<-result) }</code>
위 내용은 왜 내 Go 코드는 \'첫 번째 메시지 표시: hello\' 대신 100억 개의 숫자 합계를 인쇄합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!