Append는 여러 고루틴에서 동시에 사용하기에 스레드로부터 안전하지 않습니까?
고루틴을 사용하여 루프 내의 슬라이스에 동시에 데이터를 추가하는 경우 , 누락되거나 중복된 요소와 같은 불일치가 발생할 수 있습니다. 이 시나리오는 추가 기능이 여러 고루틴에서 동시에 사용하기에 스레드로부터 안전하지 않은지 여부에 대한 의문을 제기합니다.
대답: 데이터 경합 및 스레드 안전성 부족
Go에서는 슬라이스(또는 더 구체적으로 슬라이스 헤더)를 포함하여 동시 읽기/쓰기에 안전한 값이 없습니다. 여러 고루틴이 동일한 슬라이스를 동시에 수정하려고 시도하면 데이터 경합이 발생하여 잠재적으로 예상치 못한 동작이 발생할 수 있습니다.
데이터 경합 확인
-을 사용하여 코드를 실행할 수 있습니다. 데이터 경합이 있는지 확인하기 위한 경합 옵션:
go run -race play.go
해결책: 동기화
이 문제를 해결하고 데이터 일관성을 보장하려면 요소를 동시에 쓸 때 슬라이스. 이는 sync.Mutex를 사용하여 달성할 수 있습니다.
var mu = &sync.Mutex{} destSlice := make([]myClass, 0) var wg sync.WaitGroup for _, myObject := range sourceSlice { wg.Add(1) go func(closureMyObject myClass) { defer wg.Done() var tmpObj myClass tmpObj.AttributeName = closureMyObject.AttributeName mu.Lock() destSlice = append(destSlice, tmpObj) mu.Unlock() }(myObject) } wg.Wait()
슬라이스에 추가하기 전에 뮤텍스를 획득하고 나중에 해제하면 한 번에 하나의 고루틴에만 쓰기 액세스 권한이 부여되어 데이터 손상을 방지할 수 있습니다.
결론
슬라이스 요소는 고유한 변수로 동작하고 동시에 수정될 수 있지만 슬라이스 헤더는 본질적으로 스레드로부터 안전하지 않습니다. 안전하고 일관된 동시 쓰기 작업을 보장하려면 고루틴 내에서 슬라이스 헤더를 수정할 때 뮤텍스나 채널과 같은 동기화 메커니즘을 사용하는 것이 중요합니다.
위 내용은 Append 함수는 동시 고루틴 사용에 대해 스레드로부터 안전합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!