2017-12-18 33 views
1

Go의 sync.Map에 문제가 있습니다. 아래는 세부 사항은 다음과 같습니다 Go 동기화 맵의 동시 처리 문제

내가 좋아하는 글로벌 싱크 맵을 생성 :

var MySyncGlobalMap = sync.Map{} 

및 이벤트에 나는 map[int64]map[string]interface{}으로 의도 된 구조로이지도를 채 웁니다. 그래서 기본적으로 동기화 맵 을 int64 키로 설정하고 또 다른 동기화 맵 값을 map[string]interface{}으로 채 웁니다. 다음은지도를 채우는 방법입니다.

이제이지도에 액세스하고 일부 작업을 수행 할 여러 스레드가 있습니다. 내부 동기화 맵에 대한 지속적인 업데이트가 있습니다. 처리가 내부 동기 맵의 키에서 완료되면 해당 키가 해당 맵에서 삭제됩니다.

일단 내부 동기화 맵이 비면 작업이 완료되었음을 알게 될 것입니다.

내가 패닉 수신이지도를 액세스하는 여러 스레드가 이제부터 : 난 아직도 심지어 동기지도 사용 후 나는이 문제에 직면 오전 궁금

Fatal error: concurrent read and write

가.

내가 뭘 잘못하고 있다고 지적 할 수 있습니까?

+2

오류를 나타내는 코드 샘플을 제공해주십시오. 예를 들어'make (map [string] interface {}')를 사용하여 보통의 맵을 만들고 동시에 접근하는 것 같아요 –

+0

@ArmanOrdookhani가 질문을 업데이트했습니다 –

+1

''recSet'은 어떤 goroutine간에 공유됩니까? 'run -race main.go'와 같은 코드를 실행하여 동시에 맵에 액세스하는 위치의 스택 추적을 얻으십시오. –

답변

1

코드의 문제점을 파악했습니다. 포인터 대신 값 유형으로 sync.Map을 사용했습니다.

그래서, 나는 그 밑에있는 뮤텍스의 복사본을 만들고 있었다. 그리고 읽기/쓰기 작업에서 잠금은 원본 뮤텍스 대신 사본에있었습니다.

포인터를 사용하도록지도를 변경하면 문제가 해결됩니다.