고루틴 동작의 데이터 경합
제공된 코드 조각은 예측할 수 없는 결과를 초래할 수 있는 데이터 경합 문제를 소개합니다. 핵심 문제는 고루틴의 특성과 범위 변수가 고루틴 함수에 전달되는 방식에서 비롯됩니다.
데이터 경쟁
제공된 코드는 범위를 사용합니다. 데이터 슬라이스를 반복하고, 각 반복마다 필드 구조체의 이름 필드를 인쇄하기 위해 새로운 고루틴을 시작합니다. 그러나 각 반복 내에서 범위 변수 v는 참조인 데이터 슬라이스의 동일한 기본 데이터 구조를 가리킵니다.
루프가 진행되고 변수 v가 데이터 슬라이스를 반복함에 따라 해당 값은 다음과 같이 변경됩니다. 다음 요소를 가리킵니다. 이는 고루틴의 함수가 실행될 때 슬라이스의 마지막 요소인 v의 마지막 값을 갖게 된다는 것을 의미합니다.
따라서 고루틴을 실행하면 다음의 이름 필드가 인쇄됩니다. 의도한 "하나", "둘", "셋" 대신 마지막 요소인 "셋"만 세 번 사용합니다. 주문하세요.
솔루션
이 문제를 해결하려면 다음과 같은 여러 가지 솔루션을 사용할 수 있습니다.
새 변수 생성 :
포인터 슬라이스 사용:
슬라이스 요소의 주소 사용:
추가 접근 방식
위 내용은 이 고루틴 코드가 예상치 못한 결과를 생성하는 이유는 무엇이며 데이터 경합을 어떻게 피할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!