슬라이스에 추가하는 것이 스레드에 안전하지 않은 이유
여러 고루틴이 동시에 데이터를 슬라이스에 추가하려고 하면 데이터 경쟁 조건이 발생할 수 있습니다. 발생하다. 이는 Go의 슬라이스가 스레드로부터 안전하지 않기 때문입니다. 즉, 여러 고루틴이 동일한 슬라이스 헤더에 동시에 액세스하고 수정할 수 있어 잠재적으로 데이터 손상이 발생할 수 있기 때문입니다.
데이터 경쟁 예시
다음 코드를 고려하세요.
이 코드에서는 여러 고루틴이 동시에 destSlice에 추가됩니다. 슬라이스. 이로 인해 고루틴이 작업을 인터리브하고 서로의 변경 사항을 덮어쓸 수 있으므로 결과 슬라이스에서 데이터가 누락되거나 비어 있을 수 있습니다.
"-race" 옵션을 사용하여 데이터 경합 확인
"-race" 옵션을 사용하여 코드를 실행하면 감지된 각 데이터 경합에 대해 경고가 생성됩니다. 다음 출력은 제공된 코드의 데이터 경합 조건을 보여줍니다.
해결책: 동기화를 위해 뮤텍스 사용
스레드로부터 안전한 동시 추가를 보장하려면 destSlice 슬라이스 헤더를 보호하기 위해 뮤텍스를 사용할 수 있습니다. 다음 수정된 코드는 이를 보여줍니다.
각 추가 작업 전에 뮤텍스를 획득하면 여러 고루틴이 동시에 슬라이스 헤더를 수정하는 것을 방지하여 데이터 무결성을 보장하고 데이터 경합 조건을 제거할 수 있습니다.
위 내용은 Go에서 슬라이스에 추가하는 것이 스레드에 안전하지 않은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!