> 백엔드 개발 > Golang > Go에서 '치명적인 오류: 동시 맵 읽기 및 맵 쓰기'를 해결하는 방법은 무엇입니까?

Go에서 '치명적인 오류: 동시 맵 읽기 및 맵 쓰기'를 해결하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-31 04:09:40
원래의
429명이 탐색했습니다.

How to Solve the

"Golang 치명적인 오류: 동시 맵 읽기 및 맵 쓰기" 설명

Go에서 "치명적인 오류: 동시 맵 읽기 및 맵 쓰기" 오류는 여러 고루틴이 발생하는 경우 발생합니다. 읽기와 쓰기 모두를 위해 동시에 지도에 액세스해 보십시오. 이는 한 고루틴이 맵에서 읽기를 시도하는 동안 다른 고루틴이 동시에 맵에 쓰는 경우에 발생할 수 있습니다.

솔루션

sync.RWMutex

사용 지도에 대한 액세스를 제어하는 ​​sync.RWMutex. 이 옵션은 단일 읽기 및 쓰기(맵에 대한 루프 아님) 시나리오에 적합합니다.

var someMap = map[string]string{}
var someMapMutex = sync.RWMutex{}

go func() {
    someMapMutex.Lock()
    someMap["key"] = "value"
    someMapMutex.Unlock()
}()

someMapMutex.RLock()
v, ok := someMap["key"]
someMapMutex.RUnlock()
if !ok {
    fmt.Println("key missing")
    return
}
fmt.Println(v)
로그인 후 복사

syncmap.Map

대안은 syncmap을 사용하는 것입니다. .Map{}은 Go의 동시 지도 유형입니다. 내부적으로 경쟁 조건을 처리하며 일반적으로 일반 맵보다 느립니다. 그러나 for-loop 시나리오에서는 탁월합니다.

var someMap = syncmap.Map{}

go func() {
    someMap.Store("key", "value")
}()

v, ok := someMap.Load("key")
if !ok {
    fmt.Println("key missing")
    return
}
fmt.Println(v)

// Looping over keys is simplified with syncmap
someMap.Range(func(key, value interface{}) bool {
    val, ok := value.(string)
    if !ok {
        return false // Break iteration
    }
    fmt.Println(key, val)
    return true // Continue iteration
})
로그인 후 복사

일반 조언

이 오류를 방지하려면 -race 옵션으로 서버를 테스트하여 잠재적인 경합 조건을 식별하고 제거하는 것이 좋습니다. .

go run -race server.go
로그인 후 복사

이러한 솔루션을 구현하고 지침을 따르면 "동시 맵 읽기 및 맵 쓰기" 오류를 방지하고 다음을 보장할 수 있습니다. Go 코드의 공유 데이터에 대한 스레드로부터 안전한 액세스.

위 내용은 Go에서 '치명적인 오류: 동시 맵 읽기 및 맵 쓰기'를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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