go 루틴에서 두 개의 fmt.println을 사용할 때 교착 상태가 발생합니까?

WBOY
풀어 주다: 2024-02-09 10:15:31
앞으로
784명이 탐색했습니다.

在 go 例程中使用两个 fmt.println 时会出现死锁吗?

Go 언어에서 두 개의 fmt.Println() 인쇄 기능을 사용하면 교착 상태가 발생합니까? 이것은 일반적인 질문입니다. 대답해 보겠습니다. 먼저 교착상태(Deadlock)의 개념을 이해해야 합니다. 교착 상태는 두 개 이상의 프로세스가 서로 완료될 때까지 기다리면서 프로그램이 계속 실행될 수 없게 되는 상황입니다. Go 언어에서는 두 루틴에서 동시에 fmt.Println() 인쇄 기능을 사용하면 표준 출력이 스레드로부터 안전하므로 교착 상태가 발생하지 않습니다. 따라서 교착 상태 문제에 대한 걱정 없이 go 루틴에서 여러 fmt.Println() 함수를 안전하게 사용할 수 있습니다.

질문내용

바둑을 배우면서 운동장에서 실험도 하고 있어요. 매우 간단한 코드가 있습니다. Go 루틴에서 구조체와 슬라이스를 함께 사용하려고 합니다. 이것이 제가 프로덕션에서 사용할 수 있을지 확실하지 않지만 약간 벗어난 것 같아서 다음과 같습니다.

으아악

대기그룹이라는 말을 들어본 적은 있지만 아직은 잘 모르겠어요! 그러니 나에게 친절하게 대해주세요 :d, goroutine에서 시간을 내어

Workaround

routinemsg 上只有一个发送操作,但您有 2 个接收操作:一个在启动的 goroutine 中,另一个在 main해주셔서 감사합니다. 전송된 값은 수신자가 한 번만 받을 수 있습니다.

시작된 고루틴이 routinemsg接收,那么就会出现死锁:main부터 먼저 수신되면 영원히 차단됩니다.

If main goroutine 首先接收,那么启动的 goroutine 将永远阻塞(尝试从中接收),因此它永远无法在 routinemsg2 上发送任何内容,因此 main 中从 routinemsg2 수신도 영원히 차단됩니다. 다시 교착 상태가 됩니다.

삭제 main() 中的 fmt.println(<-routinemsg) 行,然后从 routinemsg2 的最终接收可以(最终)继续并打印包含 p1p2 和 phpcnc 的切片phpcnp3:

으아악

go 놀이터에서 사용해 보세요.

위 내용은 go 루틴에서 두 개의 fmt.println을 사용할 때 교착 상태가 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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