조건부 대기를 위해 sync.Cond를 올바르게 사용하기
sync.Cond의 기능을 탐색하는 동안 경쟁 조건이 발생할 수 있다는 것이 분명해졌습니다. sync.Mutex를 잠그는 것과 cond.Wait를 호출하는 사이. 이를 입증하기 위해 경쟁 조건을 시뮬레이션하는 인위적인 지연이 기본 고루틴에 도입되었습니다.
package main import ( "sync" "time" ) func main() { var m sync.Mutex var c = sync.NewCond(&m) go func() { time.Sleep(1 * time.Second) c.Broadcast() }() m.Lock() time.Sleep(2 * time.Second) c.Wait() }
이 코드를 실행하면 고루틴이 아직 신호를 받지 않은 조건을 기다리기 때문에 교착 상태 패닉이 발생합니다. .
경쟁 상황 해결
피하는 올바른 접근 방법 이 경쟁 조건은 cond.Wait를 호출하기 전에 sync.Mutex가 잠겨 있는지 확인하는 것입니다. 이는 현재 고루틴이 조건을 기다리는 동안 다른 고루틴이 공유 데이터를 수정하는 것을 방지합니다:
package main import ( "sync" "time" ) func main() { var m sync.Mutex var c = sync.NewCond(&m) go func() { time.Sleep(1 * time.Second) m.Lock() c.Broadcast() m.Unlock() }() m.Lock() c.Wait() m.Unlock() }
대체 동기화 구성
sync.Cond가 유용할 수 있는 동안 여러 고루틴이 공유 리소스를 사용할 수 있을 때까지 기다리는 시나리오에서는 대체 동기화 기본 요소를 고려하는 것이 중요합니다. 예를 들어, 작성자와 독자 사이에 일대일 관계가 있는 경우 sync.Mutex로 통신에 충분할 수 있습니다.
var sharedRsc = make(map[string]interface{}) func main() { m := sync.Mutex{} go func() { m.Lock() sharedRsc["rsc1"] = "foo" m.Unlock() }() m.Lock() fmt.Println(sharedRsc["rsc1"]) m.Unlock() }
여러 독자가 관련된 경우 채널은 더 효율적인 데이터 전달을 위한 확장 가능한 솔루션입니다.
위 내용은 조건부 대기에 sync.Cond를 사용할 때 경쟁 조건을 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!