>  기사  >  백엔드 개발  >  sync.WaitGroup과 함께 goroutine을 사용하면 일관되지 않은 결과가 발생합니다.

sync.WaitGroup과 함께 goroutine을 사용하면 일관되지 않은 결과가 발생합니다.

WBOY
WBOY앞으로
2024-02-09 10:30:10961검색

sync.WaitGroup과 함께 goroutine을 사용하면 일관되지 않은 결과가 발생합니다.

Go 언어에서는 고루틴을 사용하여 작업을 동시에 실행할 수 있으며, sync.WaitGroup은 고루틴 그룹이 완료될 때까지 기다리는 데 사용되는 동기화 메커니즘입니다. 그러나 PHP Editor Banana는 경우에 따라 sync.WaitGroup과 함께 goroutine을 사용하면 일관성 없는 결과가 발생할 수 있음을 발견했습니다. 이 문제는 일반적으로 여러 고루틴이 공유 변수를 동시에 수정할 때 발생합니다. 고루틴의 실행 순서가 불확실하므로 최종 결과에 불일치가 발생할 수 있습니다. 이 글에서는 이 문제의 원인을 살펴보고 고루틴 간의 결과 일관성을 보장하기 위한 몇 가지 솔루션을 제공할 것입니다.

질문 내용

고루틴(Go lang)을 사용하여 정수보다 작은 소수의 개수를 계산하려고 합니다 i. 예를 들어 i 为 100,则结果应为 25가 100인 경우 결과는 25여야 합니다.

현재 구현은 다음과 같습니다.

으아악

이 프로그램을 실행하면 더 작은 i 값(최대 약 1000)에 대해 올바른 결과를 얻습니다.

그러나 더 큰 i 값의 경우 결과가 일관되지 않고 부정확합니다.

으아악

i 的值变大,结果波动增大。是什么原因造成的?有什么方法可以使其一致且正确吗?

解决方法

您有一个共享变量,但没有适当的同步。存在竞争条件(*pr += 1)。在共享变量前后添加互斥体修复它(mu.Lock()、mu.Unlock() 값이 커질수록 결과 변동폭도 커집니다. 원인은 무엇입니까? 일관되고 올바르게 만들 수 있는 방법이 있나요?

해결 방법

공유 변수가 있지만 적절한 동기화가 없습니다. 경쟁 조건이 존재합니다(*pr += 1). 공유 변수 앞뒤에 뮤텍스를 추가하면 문제가 해결됩니다(mu.Lock(), mu.Unlock()).

🎜코드: 🎜 으아악 🎜출력: 🎜 으아악

위 내용은 sync.WaitGroup과 함께 goroutine을 사용하면 일관되지 않은 결과가 발생합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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