sync.Cond를 사용하는 경우와 단순 잠금을 사용하는 경우: sync.Cond의 문제점 및 대체 솔루션

Linda Hamilton
풀어 주다: 2024-11-12 00:16:03
원래의
989명이 탐색했습니다.

When to Use sync.Cond vs. Simple Locking: A Problem with sync.Cond and an Alternative Solution

잘못된 sync.Cond 사용 문제 해결

초기 문제 개요:

sync.Cond를 사용하려고 하면 다음과 같은 문제가 발생합니다. 경쟁 상태로 인해 교착 상태로 인해 즉각적인 패닉이 발생합니다. 개발자는 Mutex를 잠그는 것과 조건의 Wait 메서드를 호출하는 것 사이에 문제가 있다고 의심합니다.

의도된 사용 사례의 설명:

경합 조건과는 별개로 주요 목표는 여러 고루틴이 장기 실행 다운로드에서 HTTP 헤더를 사용할 수 있을 때까지 기다리는 동기화 메커니즘을 만드는 것입니다. goroutine.

해결 방법:

  • sync.Cond의 필요성 재평가: 이 경우 간단한 sync.Mutex로 충분합니다. 단 하나의 작성기(다운로더)와 여러 판독기(액세스하는 고루틴)가 있기 때문입니다. 헤더).
  • 여러 리더와 한 명의 작성자의 예:

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿