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 중국어 웹사이트의 기타 관련 기사를 참조하세요!