>  기사  >  백엔드 개발  >  Go에서 슬라이스에 추가하는 것이 스레드에 안전하지 않은 이유는 무엇입니까?

Go에서 슬라이스에 추가하는 것이 스레드에 안전하지 않은 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-09 17:30:02270검색

Why is appending to slices in Go thread-unsafe?

슬라이스에 추가하는 것이 스레드에 안전하지 않은 이유

여러 고루틴이 동시에 데이터를 슬라이스에 추가하려고 하면 데이터 경쟁 조건이 발생할 수 있습니다. 발생하다. 이는 Go의 슬라이스가 스레드로부터 안전하지 않기 때문입니다. 즉, 여러 고루틴이 동일한 슬라이스 헤더에 동시에 액세스하고 수정할 수 있어 잠재적으로 데이터 손상이 발생할 수 있기 때문입니다.

데이터 경쟁 예시

다음 코드를 고려하세요.

이 코드에서는 여러 고루틴이 동시에 destSlice에 추가됩니다. 슬라이스. 이로 인해 고루틴이 작업을 인터리브하고 서로의 변경 사항을 덮어쓸 수 있으므로 결과 슬라이스에서 데이터가 누락되거나 비어 있을 수 있습니다.

"-race" 옵션을 사용하여 데이터 경합 확인

"-race" 옵션을 사용하여 코드를 실행하면 감지된 각 데이터 경합에 대해 경고가 생성됩니다. 다음 출력은 제공된 코드의 데이터 경합 조건을 보여줍니다.

해결책: 동기화를 위해 뮤텍스 사용

스레드로부터 안전한 동시 추가를 보장하려면 destSlice 슬라이스 헤더를 보호하기 위해 뮤텍스를 사용할 수 있습니다. 다음 수정된 코드는 이를 보여줍니다.

각 추가 작업 전에 뮤텍스를 획득하면 여러 고루틴이 동시에 슬라이스 헤더를 수정하는 것을 방지하여 데이터 무결성을 보장하고 데이터 경합 조건을 제거할 수 있습니다.

위 내용은 Go에서 슬라이스에 추가하는 것이 스레드에 안전하지 않은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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