>백엔드 개발 >Golang >'range'를 사용하는 Go 맵에 대한 동시 반복은 안전하며 어떻게 달성할 수 있나요?

'range'를 사용하는 Go 맵에 대한 동시 반복은 안전하며 어떻게 달성할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-12-13 17:43:21610검색

Is Concurrent Iteration Over Go Maps with `range` Safe, and How Can It Be Achieved?

Go에서 Range를 사용하여 지도에 동시 액세스

Go에서 range 키워드를 사용하여 지도에 동시 액세스한다는 개념은 종종 오해됩니다. 이 문제를 명확히 하기 위해 지도에 동시에 액세스하는 것과 범위 사용의 의미를 살펴보겠습니다.

범위 표현식 평가

for 문의 범위 표현식은 루프 전에 한 번만 평가됩니다. 특정 특정 시나리오를 제외하고 시작됩니다. 맵의 경우 범위 표현식은 단순히 맵 변수를 가리킵니다.

범위를 사용한 반복

범위를 사용한 반복 중에 키 및 값 변수(대부분의 경우 k 및 v) 각 반복 중에 맵의 값을 유지합니다. 그러나 반복을 실행하는 동안 for 블록 내에서는 맵 액세스가 발생하지 않습니다. 다음 반복을 위해 k 및 v 값이 설정될 때 발생합니다.

안전한 동시 반복

이러한 개념을 이해하면 보호를 위해 잠금을 사용하여 맵에 대해 동시 반복을 수행하는 것이 안전합니다. 반복하는 동안 지도. 그러나 반복 내 잠금 해제는 조기 반환을 처리하기 위해 지연된 문으로 수행되어야 합니다.

var testMap = make(map[int]int)
var testMapLock = &sync.RWMutex{}

func IterateMapKeys(iteratorChannel chan int) error {
    testMapLock.RLock()
    defer testMapLock.RUnlock()
    for k, v := range testMap {
        testMapLock.RUnlock()
        someFunc()
        testMapLock.RLock()
        if someCond {
            return someErr
        }
    }
    return nil
}

동시 수정

이러한 유형의 잠금 방식은 동시 액세스에 대해서만 보호한다는 점에 유의하는 것이 중요합니다. . 다른 고루틴에 의한 동시 수정을 방지하지 않습니다. 그러나 수정 사항이 쓰기 잠금으로 보호되면 안전한 상태로 유지되지만 for 루프가 반드시 새 쌍을 반복하지는 않습니다.

안전하지 않은 관행

for 블록 내에서 읽기 잠금 잠금 해제 다른 고루틴이 지도를 수정하고 잠재적으로 경쟁 조건을 일으킬 수 있으므로 안전하지 않습니다.

위 내용은 'range'를 사용하는 Go 맵에 대한 동시 반복은 안전하며 어떻게 달성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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