lock
문의 내부 작동 원리 살펴보기
개발자는 스레드로부터 안전하지 않은 개체를 처리할 때 코드 실행을 보호하기 위해 lock
문을 사용하는 경우가 많습니다. 하지만 여러 스레드가 이 보호된 코드와 상호 작용할 때 내부적으로는 정확히 무슨 일이 발생할까요?
심층 분석: lock
문 실행 추적
C# 3.0에서 lock
문은 다음 코드로 변환됩니다.
<code class="language-C#">var temp = obj; Monitor.Enter(temp); try { // 非线程安全代码 } finally { Monitor.Exit(temp); }</code>
C# 4.0에서는 이 프로세스가 수정되어 생성된 코드는 다음과 같습니다.
<code class="language-C#">bool lockWasTaken = false; var temp = obj; try { Monitor.Enter(temp, ref lockWasTaken); // 非线程安全代码 } finally { if (lockWasTaken) { Monitor.Exit(temp); } }</code>
Monitor.Enter
기능
Monitor.Enter
은 lock
문의 기능에서 중요한 역할을 합니다. MSDN은 해당 작업을 다음과 같이 설명합니다.
" Enter
을 사용하여 인수로 전달된 개체의 Monitor
을 가져옵니다. 다른 스레드가 이미 개체에 대해 Enter
을 실행했지만 해당 Exit
을 아직 실행하지 않은 경우 현재 스레드는 차단됩니다. 다른 스레드가 개체를 해제할 때까지”
기본적으로 Monitor.Enter
은 개체에 대한 독점적인 액세스를 보장합니다. 다른 스레드가 동일한 잠금을 획득하려고 시도하면 잠금이 해제될 때까지 일시 중단됩니다. 동일한 스레드에서 Enter
을 여러 번 호출하면 차단이 발생하지 않지만 개체의 잠금을 해제하고 대기 중인 스레드가 실행을 재개할 수 있도록 하려면 동일한 수의 Exit
호출이 필요합니다.
무한대기시간
Monitor.Enter
은 잠금을 사용할 수 있을 때까지 무기한 기다립니다. 일부 잠금 메커니즘과 달리 시간 초과를 적용하지 않습니다.
위 내용은 C# `lock` 문은 내부적으로 어떻게 작동하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!