>  기사  >  백엔드 개발  >  WaitGroup이 있음에도 불구하고 고루틴이 중단된 것 같습니다.

WaitGroup이 있음에도 불구하고 고루틴이 중단된 것 같습니다.

PHPz
PHPz앞으로
2024-02-06 09:06:07941검색

尽管存在 WaitGroup,Goroutines 似乎还是被中断了

질문 내용

대기 그룹이 있음에도 불구하고 고루틴이 끝나지 않는 문제가 있습니다. 첨부된 코드에서 힙 순열 알고리즘의 구현을 볼 수 있습니다. 속도를 높이고 싶었기 때문에 가능한 첫 번째 숫자 각각에 대해 고루틴을 만들어서 각 고루틴의 순열을 (n-1)!。总的来说,我应该仍然有 n! 排列 (n*(n-1)!= n!),但我的主例程似乎在子例程完成之前退出。然后我尝试跟踪执行的排列。与我的信念相反,执行的排列数量不是恒定的,但在 n! 下总是有点(对于低 n)或非常多(对于大 n)으로 줄였습니다.

예를 들어 n=4 每次的排列都是 24,即 4! ,这样所有的 goroutine 就结束了。如果我有一个更高的数字,例如 n=8,我会得到一个大约 13500 的值,而不是预期的 40000 = 8!.

이런 행동은 어디서 오는 걸까요? 메인 프로그램이 종료되기 전에 모든 고루틴이 완료되었는지 확인하는 방법은 무엇입니까?

으아아아

(동일한 동작은 https://go.dev/play/에서 쉽게 달성할 수 있으므로 재현성이 매우 높습니다.)


정답


귀하의 코드에서 고루틴은 permutations 变量。当您增加 n 값으로 동시에 액세스합니다. , 작업량이 증가하여 예상치 못한 결과를 초래하는 문제가 될 수 있습니다.

mutex,它将确保当时只有一个goroutine可以访问permutations를 사용할 수 있습니다.

으아아아

위 내용은 WaitGroup이 있음에도 불구하고 고루틴이 중단된 것 같습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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