2010-01-03 5 views

답변

14

goroutines를 사용하고 channels을 통해지도에 대한 액세스를 동기화하고 싶습니다. the FAQ에서 설명 :

긴 토론 후에는지도의 전형적인 사용은 여러 스레드에서 안전하게 접근을 필요로하지 했다는 것을 결정했다, 그것은 한 사람의 경우 에,지도 몇 가지 큰 데이터의 아마 일부였다 구조 또는 이미 동기화 된 계산 따라서 모든 맵 작업에서 뮤텍스를 가져와야 대부분의 프로그램이 느려지고 몇 가지 경우에는 안전을 추가 할 수 있습니다. 그러나 통제가 불가능한지도 액세스로 인해 프로그램이 중단 될 수 있으므로 이라는 뜻이므로 쉬운 결정이 아닙니다.

이 언어는 원자지도 업데이트를 배제하지 않습니다. 필요한 경우, 그러한 은 신뢰할 수없는 프로그램을 호스트 할 때와 마찬가지로 인터록 맵 액세스를 구현할 수 있습니다.

+0

그것은 현명하지만 스레드 기능이있는 함수를 문서화하고 유지 관리해야합니다. 종종 나는 pass1에서 값으로 맵을 채우고 pass2에서는 단일 동기화없이 많은 다른 스레드에서 동시에 읽는 코드를 실행합니다. – Lothar

+0

Go 스타일은 공유 된 가변 상태를 사용하여 매우 강력하게 비중을 두었습니다. 다른 스레드에서 맵을 읽는 중이라면 괜찮을 것입니다. (이것은 절대적으로 말하지는 않지만 논리적 읽기에서 물리적으로 변형 된 그럴듯한지도 구현이 있습니다 ...) – poolie

1

Go 1.9부터 가장 좋은 방법은 sync.Map 유형을 사용하는 것입니다.