제공된 코드에는 ConcurrentStruct() 및 ConcurrentStructWithMuLock이라는 두 가지 함수가 도입되었습니다. (). 두 함수 모두 구조체를 동시에 읽고 쓰지만 전자는 잠금 없이 수행하고 경합 경고를 생성합니다. 반대로 후자는 읽기-쓰기 뮤텍스를 사용하여 액세스를 동기화하므로 경합 경고가 발생하지 않습니다.
오류 메시지에서 알 수 있듯이 다음과 같은 경우 데이터 경합이 발생합니다.
concurrentStruct()에서 이러한 상황은 메타데이터 구조체의 키 필드가 동기화 없이 여러 고루틴에 의해 액세스되고 수정되기 때문에 발생합니다.
concurrentStruct()는 잠금을 사용하지 않지만, 익명의 고루틴이 무한정 실행되면 잠재적인 경쟁 상황이 발생할 수 있습니다. 이러한 고루틴은 다른 고루틴의 동작을 고려하지 않고 지속적으로 키 필드를 읽고, 수정하고 씁니다.
concurrentStruct()와 대조적으로, ConcurrentStructWithMuLock()은 읽기를 사용합니다. - 키 필드에 대한 액세스를 동기화하기 위해 뮤텍스를 작성합니다. 이는 상호 배제를 보장하여 여러 고루틴이 동시에 필드를 수정하는 것을 방지합니다. 결과적으로 경쟁 조건이 발생하지 않으며 경고 없이 함수가 실행됩니다.
concurrentMap() 함수는 Go 맵과 관련된 다른 유형의 경쟁 조건을 보여줍니다. . Go에서 맵은 스레드로부터 안전하지만 적절한 동기화 없이 읽기 및 쓰기 모두에 대해 맵에 동시에 액세스하면 치명적인 오류가 발생할 수 있습니다. Go의 런타임에는 정의되지 않은 동작을 방지하기 위해 지도에 대한 비동기화된 액세스가 감지되면 프로그램이 충돌하는 경량 데이터 경합 감지기가 포함되어 있습니다.
위 내용은 Go 구조체에 대한 동시 읽기 및 쓰기 작업을 어떻게 안전하게 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!