초기 문제 개요:
sync.Cond를 사용하려고 하면 다음과 같은 문제가 발생합니다. 경쟁 상태로 인해 교착 상태로 인해 즉각적인 패닉이 발생합니다. 개발자는 Mutex를 잠그는 것과 조건의 Wait 메서드를 호출하는 것 사이에 문제가 있다고 의심합니다.
의도된 사용 사례의 설명:
경합 조건과는 별개로 주요 목표는 여러 고루틴이 장기 실행 다운로드에서 HTTP 헤더를 사용할 수 있을 때까지 기다리는 동기화 메커니즘을 만드는 것입니다. goroutine.
해결 방법:
여러 리더와 한 명의 작성자의 예:
var sharedRsc = make(map[string]interface{}) func main() { var wg sync.WaitGroup wg.Add(2) m := sync.Mutex{} c := sync.NewCond(&m) go func() { c.L.Lock() for len(sharedRsc) == 0 { c.Wait() } fmt.Println(sharedRsc["rsc1"]) c.L.Unlock() wg.Done() }() go func() { c.L.Lock() for len(sharedRsc) == 0 { c.Wait() } fmt.Println(sharedRsc["rsc2"]) c.L.Unlock() wg.Done() }() c.L.Lock() sharedRsc["rsc1"] = "foo" sharedRsc["rsc2"] = "bar" c.Broadcast() c.L.Unlock() wg.Wait() }
대체 솔루션:
이 상황에서 채널 사용이 가능하다면 여전히 가능합니다. 데이터를 전달하는 데 선호되는 방법입니다.
위 내용은 sync.Cond를 사용하는 경우와 단순 잠금을 사용하는 경우: sync.Cond의 문제점 및 대체 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!