동시 고루틴의 상호 배제: 코드 격리 달성
동시 프로그래밍에서는 여러 고루틴이 실행되는 것을 방지하는 메커니즘을 마련하는 것이 중요합니다. 동일한 코드를 동시에 사용합니다. 이는 데이터 무결성을 보장하고 예상치 못한 동작을 방지합니다.
다음 시나리오를 고려하십시오.
<code class="go">Routine 1 { do something *Send int to Routine 2 Send int to Routine 3 Print Something Print Something* do something } Routine 2 { do something *Send int to Routine 1 Send int to Routine 3 Print Something Print Something* do something } Routine 3 { do something *Send int to Routine 1 Send int to Routine 2 Print Something Print Something* do something }</code>
여기서 do Something 마커 사이의 코드 섹션이 실행되는 동안 제어가 다음으로 흐르는 것을 방지하려고 합니다. 다른 고루틴. 예를 들어 Routine1이 별 내의 부분을 실행하는 경우 Routine2와 Routine3은 차단되어야 합니다.
WaitGroup으로 상호 배제 달성
상호 배제를 시행하는 한 가지 접근 방식은 다음과 같습니다. sync.WaitGroup을 사용하세요. 그러나 이 기술은 고루틴을 선택적으로 차단하는 기능이 부족하기 때문에 이 시나리오에는 적용할 수 없습니다.
격리를 위해 뮤텍스 활용
더 효과적인 솔루션은 동기화를 사용하는 것입니다. .뮤텍스. 뮤텍스는 주어진 시간에 단 하나의 고루틴만이 이를 소유할 수 있도록 보장합니다. 뮤텍스를 사용하여 상호 배제를 구현하는 방법은 다음과 같습니다.
<code class="go">package main import ( "fmt" "sync" ) var ( mutex1, mutex2, mutex3 sync.Mutex ) func Routine1() { mutex1.Lock() // do something for i := 0; i < 200; i++ { mutex2.Lock() mutex3.Lock() fmt.Println("value of z") mutex2.Unlock() mutex3.Unlock() } // do something mutex1.Unlock() } func Routine2() { mutex2.Lock() // do something for i := 0; i < 200; i++ { mutex1.Lock() mutex3.Lock() fmt.Println("value of z") mutex1.Unlock() mutex3.Unlock() } // do something mutex2.Unlock() } func Routine3() { mutex3.Lock() // do something for i := 0; i < 200; i++ { mutex1.Lock() mutex2.Lock() fmt.Println("value of z") mutex1.Unlock() mutex2.Unlock() } // do something mutex3.Unlock() } func main() { go Routine1() go Routine2() Routine3() }</code>
이 코드에서는
결과적으로 각 고루틴 내부의 인쇄 문은 한 번에 하나씩 실행되어 다른 고루틴이 그 때까지 해당 행에 액세스할 수 없도록 합니다. 현재 고루틴이 잠금을 해제했습니다.
위 내용은 뮤텍스를 사용하여 동시 고루틴에서 상호 배제를 보장하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!