지도에서 삭제할 수 있습니다 포함한 동시 작가를 가지고지도 m
이상에 이르기까지,이 스레드 안전하지 이것이 내가 스레드 안전 I로 생각하고이동 범위에서 스레드로부터 안전하지 않은 값을 사용하고 있습니까?
for k, v := range m { ... }
을 ?:하는 것입니다 다른 가능한 작성자가 값을 v
으로 변경하는 것을 방지해야합니다. (뮤텍스를 사용할 때 잠금이 별도의 단계이기 때문에) k
이 여전히지도에 있는지 확인하십시오. 예를 들어 :
for k := range m {
m.mutex.RLock()
v, found := m[k]
m.mutex.RUnlock()
if found {
... // process v
}
}
는 (다른 작가 v
을 변경하기 전에 m
을 쓰기 잠금 가정합니다.) 더 좋은 방법이 있나요?
편집 추가 :지도가 스레드로부터 안전하지 않다는 것을 알고 있습니다. 그러나 Go 규격의 http://golang.org/ref/spec#For_statements ("아직 도달하지 않은지도 항목이 반복 중에 삭제되는 경우"를 검색)에 따르면이 방법은 스레드로부터 안전합니다. 이 페이지는 range
을 사용하는 코드가지도에 삽입하거나지도에서 삭제하는 다른 goroutine에 대해 걱정할 필요가 없음을 나타냅니다. 내 질문은,이 thread-safe-ness 읽을 수있는 유일한for k, v := range m
및 다른 스레드 안전 메커니즘을 사용하여 얻을 수 있도록 v
확장합니까? 나는 그것이 작동하지 않는다는 것을 증명하기 위해 앱 크래시를 강제하기 위해 테스트 코드를 만들었지 만, 깔끔하게 스레드 안전하지 않은 코드 (많은 goroutine이 동일한 맵 값을 맹목적으로 수정하지 않고 많은 장소에서 잠금 메커니즘을 수정 함) 추락하자!
그냥 코멘트 (아마 이미 다른 독자들에 대한보다 그것을 알고있는 영업 이익 이하) : http://golang.org/doc/go_faq.html#atomic_maps 응답에 대한 –