>백엔드 개발 >Golang >교착 상태 - 모든 고루틴이 잠자기 상태입니다(대기 그룹을 사용하더라도).

교착 상태 - 모든 고루틴이 잠자기 상태입니다(대기 그룹을 사용하더라도).

PHPz
PHPz앞으로
2024-02-09 13:40:081150검색

死锁 - 所有 goroutine 都处于睡眠状态(即使使用等待组)

PHP 편집자 Xiaoxin은 일반적인 동시 프로그래밍 문제인 교착 상태를 소개하기 위해 왔습니다. 교착 상태는 모든 고루틴이 절전 상태에 진입하여 대기 그룹과 같은 메커니즘을 사용해도 계속 실행할 수 없음을 의미합니다. 이 경우 모든 고루틴이 앞으로 나아갈 수 없어 프로그램이 무한 대기 상태에 빠지게 됩니다. 동시 프로그래밍에서는 교착 상태를 피하는 것이 매우 중요하며, 프로그램이 정상적으로 작동하려면 교착 상태의 원인과 해결 방법을 이해해야 합니다.

질문 내용

저는 바둑 동시성을 배우고 있는데 두 바둑 루틴이 채널을 통해 업데이트된 값을 전달하면서 계속해서 서로 통신하기를 원합니다. 하나는 2를 더하고 다른 하나는 1을 뺍니다. 코드와 출력은 다음과 같습니다:

이 코드에 어떤 문제가 있나요?

으아악

출력:

으아악

그러면 종료됩니다.

고루틴에서 wg.done()을 호출하지 않아도 왜 고루틴은 항상 값을 교환하지 않나요?

해결 방법

시작하는 두 goroutine 모두 값을 받고 값을 보낸 다음 종료됩니다. 거기부터는 그냥 main goroutine,在 wg.wait() 处被阻止,因为你从未调用 wg.done()입니다.

(n 무한) 루프를 사용하는 것을 잊어버렸습니다:

으아악

이 변경으로 인해 애플리케이션은 영원히 실행되며 출력은 다음과 같습니다.

으아악

위 내용은 교착 상태 - 모든 고루틴이 잠자기 상태입니다(대기 그룹을 사용하더라도).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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