> 백엔드 개발 > C++ > C# `lock` 문은 내부적으로 어떻게 작동하나요?

C# `lock` 문은 내부적으로 어떻게 작동하나요?

Mary-Kate Olsen
풀어 주다: 2025-01-15 09:54:44
원래의
488명이 탐색했습니다.

How Does the C# `lock` Statement Work Under the Hood?

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.Enterlock 문의 기능에서 중요한 역할을 합니다. MSDN은 해당 작업을 다음과 같이 설명합니다.

" Enter을 사용하여 인수로 전달된 개체의 Monitor을 가져옵니다. 다른 스레드가 이미 개체에 대해 Enter을 실행했지만 해당 Exit을 아직 실행하지 않은 경우 현재 스레드는 차단됩니다. 다른 스레드가 개체를 해제할 때까지”

기본적으로 Monitor.Enter은 개체에 대한 독점적인 액세스를 보장합니다. 다른 스레드가 동일한 잠금을 획득하려고 시도하면 잠금이 해제될 때까지 일시 중단됩니다. 동일한 스레드에서 Enter을 여러 번 호출하면 차단이 발생하지 않지만 개체의 잠금을 해제하고 대기 중인 스레드가 실행을 재개할 수 있도록 하려면 동일한 수의 Exit 호출이 필요합니다.

무한대기시간

Monitor.Enter은 잠금을 사용할 수 있을 때까지 무기한 기다립니다. 일부 잠금 메커니즘과 달리 시간 초과를 적용하지 않습니다.

위 내용은 C# `lock` 문은 내부적으로 어떻게 작동하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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