상호 배제의 개념은 프로그램에서 함수 또는 코드 블록의 동시 실행을 제어합니다. 여러 루틴이 독립적으로 실행되는 동시 프로그래밍 환경에서는 정확성을 보장하고 충돌을 방지하기 위해 상호 배제를 유지하는 것이 중요합니다.
문제:
3개의 동시 고루틴이 있는 시나리오를 고려해 보세요(루틴 1, 2, 3)은 데이터를 교환하고 인쇄 작업을 수행합니다. 목표는 모든 고루틴의 특정 코드 섹션이 실행되는 동안 이 섹션이 완료될 때까지 다른 고루틴의 실행이 중지되도록 하는 것입니다.
뮤텍스를 사용한 솔루션:
뮤텍스 기본 동기화 프리미티브인 는 고루틴에서 상호 배제를 달성하기 위해 사용될 수 있습니다. 뮤텍스는 한 번에 하나의 고루틴만 코드의 중요한 섹션에 액세스할 수 있도록 하는 잠금 메커니즘을 제공합니다.
제공된 코드 조각에는 세 개의 뮤텍스(mutex1, mutex2 및 mutex3)가 도입되었습니다.
var ( mutex1, mutex2, mutex3 sync.Mutex wg sync.WaitGroup )
수정된 코드에 표시된 것처럼 각 goroutine은 임계 섹션을 실행하기 전에 적절한 뮤텍스를 획득합니다.
func Routine1() { mutex1.Lock() // do something ... // do something mutex1.Unlock() ... } func Routine2() { mutex2.Lock() ... // do something ... mutex2.Unlock() ... } func Routine3() { ... mutex3.Lock() // do something ... mutex3.Unlock() ... }
대기 그룹 및 동기화:
또한 고루틴을 동기화하기 위해 대기 그룹(wg)이 사용되었습니다.
wg.Add(3) go Routine1() go Routine2() Routine3() wg.Wait()
결과:
이 구현을 통해 고루틴은 상호 배타적입니다. 결과적으로 각 루틴의 인쇄 작업이 겹치거나 인터리브되지 않아 경합 상태가 방지되고 예상한 출력이 생성됩니다.
위 내용은 뮤텍스를 사용하여 동시 고루틴에서 상호 배제를 어떻게 달성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!