>  기사  >  백엔드 개발  >  다음 go 프로그램에서 교착 상태 오류 "Fatal error: All goroutines are Sleep - 교착 상태!"가 발생하는 이유는 무엇입니까?

다음 go 프로그램에서 교착 상태 오류 "Fatal error: All goroutines are Sleep - 교착 상태!"가 발생하는 이유는 무엇입니까?

PHPz
PHPz앞으로
2024-02-09 08:00:11401검색

为什么下面的 go 程序会出现死锁错误“致命错误:所有 goroutine 都在睡眠 - 死锁!”

Go 언어에서 교착 상태는 일반적인 오류입니다. 모든 고루틴이 절전 모드일 때 치명적인 오류가 발생합니다: "치명적인 오류: 모든 고루틴이 절전 모드입니다 - 교착 상태!" 이 상황은 일반적으로 여러 고루틴이 서로를 기다리고 있을 때 발생합니다. 한 고루틴이 다른 고루틴이 작업을 완료할 때까지 기다리고, 다른 고루틴이 첫 번째 고루틴이 작업을 완료할 때까지 기다리면 교착 상태가 발생합니다. 이 경우 모든 고루틴을 계속 실행할 수 없기 때문에 프로그램을 계속 실행할 수 없습니다. 교착 상태 오류를 방지하려면 고루틴 간의 종속성을 신중하게 설계하고 관리하여 올바르게 함께 작동할 수 있도록 해야 합니다.

질문 내용

저는 golang을 처음 접하고 채널의 일반적인 생산자 소비자를 사용하려고 합니다. 생산자와 소비자 모두 동일한 채널에서 쓰고 읽어야 한다는 것을 이해합니다. 하지만 단지 실험을 위해 아래와 같이 다양한 채널에서 글을 쓰고 읽도록 했습니다

으아악

프로그램을 실행하면 아래와 같은 오류가 발생합니다.

으아악

이제 두 고루틴이 모두 차단되었다는 것을 알고 있지만 하나는 채널 1에 대한 읽기 호출이고 다른 하나는 채널에 대한 쓰기 호출이므로 프로그램이 종료되지 않습니다. 하지만 제 질문은, 실제로 이러한 채널에서 값을 기다리고 있다면 프로그램이 교착 상태를 선언하는 대신 무한정 기다려야 하는 것이 아닌가 하는 것입니다. 나중에 일부 네트워크 읽기/쓰기로 인해 값이 도착하고 다른 일부 루틴이 이러한 채널에 쓰기 시작하면 어떻게 될까요?

해결 방법

실행 중인 프로그램은 모든 고루틴이 동기화 프리미티브에서 차단된 경우에만 교착 상태 패닉으로 종료됩니다. 모든 고루틴이 채널 작업 및/또는 뮤텍스 잠금을 기다리면서 차단되면 네트워크 연결을 수신하는 고루틴이 없기 때문에 네트워크 수신이 불가능합니다. 이는 또한 많은 고루틴이 있는 프로그램에서 교착 상태의 고루틴 그룹이 많이 있을 수 있지만 계속 실행될 수 있는 다른 고루틴이 있기 때문에 프로그램은 계속 실행된다는 것을 의미합니다.

위 내용은 다음 go 프로그램에서 교착 상태 오류 "Fatal error: All goroutines are Sleep - 교착 상태!"가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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