>  기사  >  백엔드 개발  >  조건부 대기에 sync.Cond를 사용할 때 경쟁 조건을 피하는 방법은 무엇입니까?

조건부 대기에 sync.Cond를 사용할 때 경쟁 조건을 피하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-10 14:21:02899검색

How to Avoid Race Conditions When Using sync.Cond for Conditional Waiting?

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.