> 백엔드 개발 > Golang > 내 고루틴이 다음 뮤텍스 코드에서 멈추는 원인은 무엇입니까?

내 고루틴이 다음 뮤텍스 코드에서 멈추는 원인은 무엇입니까?

王林
풀어 주다: 2024-02-13 18:57:07
앞으로
717명이 탐색했습니다.

是什么导致我的 goroutine 在以下互斥体代码中陷入僵局?

PHP 편집자 Xinyi는 "내 고루틴이 다음 뮤텍스 코드에서 멈추는 원인은 무엇입니까?"라는 일반적인 질문에 답하기 위해 왔습니다. 동시 프로그래밍에서 뮤텍스 잠금(Mutex)을 사용하는 것이 일반적입니다. 해결 방법 중 하나 공유 자원에 대한 경쟁. 그러나 코드에 문제가 있는 경우 고루틴이 교착 상태에 빠져 실행을 계속할 수 없게 될 수 있습니다. 다음으로 이 문제의 가능한 원인을 자세히 논의하고 해결책을 제시하겠습니다.

질문 내용

열쇠 지도를 저장하려고 하는데, 각 열쇠에는 별도의 자물쇠가 있습니다. 특정 키에 대한 잠금을 생성할 때 전역 뮤텍스를 사용하여 맵에 씁니다.

열쇠에 대한 자물쇠 생성을 마친 후 새 자물쇠를 사용하고 작업이 완료되면 해제하겠습니다. 현재 코드를 테스트하기 위해 단일 키를 수정하려고 합니다.

코드는 다음과 같습니다:

으아악

왜 잠금을 획득할 수 없는지 모르겠습니다. 플레이그라운드 링크: https://go.dev/play/p/-co0xaxpuy0

Solution

mylock은 전역 뮤텍스와 개별 뮤텍스를 잠글 수 있습니다. 이로 인해 어떤 경우에는 잠금 해제가 불가능해집니다:

  1. goroutine 1은 mylock(2)을 호출합니다. 이로 인해 단일 잠금 l2가 예상대로 잠깁니다.
  2. goroutine 2는 mylock(2)을 호출합니다. 전역 잠금을 획득한 다음 l2가 해제될 때까지 기다리는 것을 차단합니다. 대기하는 동안 전역 잠금은 계속 유지됩니다.
  3. goroutine 1은 myunlock(2)을 호출합니다. 전역 잠금(고루틴 2에 의해 유지됨)이 해제되기를 기다리면서 차단되었습니다. 이것은 교착 상태입니다.

이 문제를 해결하려면 잠금을 (해제)하는 대신 전역 잠금을 누른 상태에서 개별 잠금을 반환하세요. myunlock 기능이 불필요해졌습니다: ​​

으아악

성능을 향상하려면 먼저 전역 읽기 잠금만 유지하면서 단일 잠금이 존재하는지 확인할 수 있습니다(이렇게 하면 count가 나타내는 내용이 변경된다는 점에 유의하세요).

으아악

위 내용은 내 고루틴이 다음 뮤텍스 코드에서 멈추는 원인은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿