다음을 통해 공유


Lock 클래스

정의

참고

이 미리 보기 API를 사용하려면 프로젝트 파일에서 EnablePreviewFeatures 속성을 True로 설정하여 프로젝트에서 미리 보기 기능을 사용하도록 해야 합니다. 자세한 내용은 https://aka.ms/dotnet-preview-features를 참조하세요.

서로 다른 스레드 간의 코드 영역에서 상호 배제를 달성하기 위한 메커니즘을 제공합니다.

public ref class Lock sealed
[System.Runtime.Versioning.RequiresPreviewFeatures]
public sealed class Lock
[<System.Runtime.Versioning.RequiresPreviewFeatures>]
type Lock = class
Public NotInheritable Class Lock
상속
Lock
특성

설명

클래스는 Lock 리소스에 대한 동시 액세스를 방지하기 위해 일반적으로 중요한 섹션이라고 하는 프로세스의 스레드 간에 상호 배타적인 액세스가 필요한 코드 영역을 정의하는 데 사용할 수 있습니다. 를 Lock 입력하고 종료할 수 있습니다. 여기서 enter와 exit 사이의 코드 영역은 잠금과 관련된 중요한 섹션입니다. 잠금에 들어가는 스레드는 잠금을 종료할 때까지 잠금을 보유하거나 소유한다고 합니다. 최대 하나의 스레드는 지정된 시간에 잠금을 유지할 수 있습니다. 스레드는 여러 잠금을 보유할 수 있습니다. 스레드는 재귀적으로 종료하기 전에 잠금을 여러 번 입력할 수 있습니다. 잠금을 즉시 입력할 수 없는 스레드는 잠금이 입력될 때까지 또는 지정된 시간 제한이 만료될 때까지 기다릴 수 있습니다.

또는 TryEnter 메서드를 Enter 사용하여 잠금을 입력하는 경우:

  • 블록을 사용하여 C#과 같은 예외가 있는 경우에도 스레드가 잠금 Exittry/finally 종료하는지 확인합니다.
  • C# async 메서드에서 잠금을 입력하고 종료할 때 enter 및 exit 사이에 없음 await 을 확인합니다. 잠금은 스레드에 의해 유지되며 다음 코드는 await 다른 스레드에서 실행될 수 있습니다.

C# using 키워드(keyword) 같은 반환 Lock.Scope 된 를 자동으로 삭제하는 언어 구문과 함께 메서드를 사용 EnterScope 하거나 예외적인 경우 잠금이 종료되도록 C# lock 키워드(keyword) 사용하는 것이 좋습니다. 이러한 패턴은 및 Exit를 사용하는 Enter/TryEnter 데 비해 성능상의 이점이 있을 수도 있습니다. 다음 코드 조각에서는 잠금을 입력하고 종료하기 위한 다양한 패턴을 보여 줍니다.

public sealed class ExampleDataStructure
{
    private readonly Lock _lockObj = new();

    public void Modify()
    {
        lock (_lockObj)
        {
            // Critical section associated with _lockObj
        }

        using (_lockObj.EnterScope())
        {
            // Critical section associated with _lockObj
        }

        _lockObj.Enter();
        try
        {
            // Critical section associated with _lockObj
        }
        finally { _lockObj.Exit(); }

        if (_lockObj.TryEnter())
        {
            try
            {
                // Critical section associated with _lockObj
            }
            finally { _lockObj.Exit(); }
        }
    }
}

C# lock 키워드(keyword) 사용하거나 잠금을 입력하고 종료하는 것과 유사한 경우 식의 형식은 정확하게 System.Threading.Lock이어야 합니다. 식의 형식이 다른 것(예: Object 또는 과 같은 T제네릭 형식)인 경우 교환할 수 없는 다른 구현을 대신 사용할 수 있습니다(예: Monitor). 자세한 내용은 관련 컴파일러 스펙렛을 참조하세요.

Interrupt 는 잠금을 입력하기 위해 대기 중인 스레드를 인터럽트할 수 있습니다. Windows STA 스레드에서 잠금을 대기하면 대기하는 동안 동일한 스레드에서 다른 코드를 실행할 수 있는 메시지 펌핑이 허용됩니다. 대기의 일부 기능은 사용자 지정 SynchronizationContext에 의해 재정의될 수 있습니다.

참고

재귀적으로 같은 여러 번을 포함하여 잠금에 들어가는 스레드는 잠금을 완전히 종료하고 다른 스레드가 잠금에 들어갈 수 있도록 잠금을 동일한 횟수만큼 종료해야 합니다. 를 보유 Lock하는 동안 스레드가 종료되면 의 동작이 Lock 정의되지 않습니다.

주의

코드 경로에서 스레드가 여러 잠금을 종료하기 전에 입력할 수 있는 경우 동일한 스레드에서 두 잠금을 입력할 수 있는 모든 코드 경로가 동일한 순서로 입력되도록 합니다. 그렇지 않으면 교착 상태가 발생할 수 있습니다. 예를 들어 한 코드 경로 스레드 T1 에서 잠금 L1 을 입력한 다음 L2 잠금을 모두 종료하고 다른 코드 경로 스레드 T2 에서 두 잠금을 역순으로 입력하는 것이 좋습니다. 이 시나리오에서는 다음 이벤트 순서가 발생할 T1 수 있습니다. 를 입력하고L1, 를 T2 입력 L2T1 하고, 를 입력 L2 하고, 대기하고, 를 입력 L1 하고 대기 T2 합니다. 와 T2 사이에 T1 는 해결할 수 없는 교착 상태가 있으며, 나중에 잠금을 입력하려고 하는 다른 스레드도 중단됩니다.

생성자

Lock()

Lock 클래스의 새 인스턴스를 초기화합니다.

속성

IsHeldByCurrentThread

잠금이 현재 스레드에 의해 유지되는지 여부를 나타내는 값을 가져옵니다.

메서드

Enter()

잠금을 입력할 수 있을 때까지 필요한 경우 대기하여 잠금을 입력합니다.

EnterScope()

잠금을 입력할 수 있을 때까지 필요한 경우 대기하여 잠금을 입력합니다.

Equals(Object)

지정된 개체가 현재 개체와 같은지 확인합니다.

(다음에서 상속됨 Object)
Exit()

잠금을 종료합니다.

GetHashCode()

기본 해시 함수로 작동합니다.

(다음에서 상속됨 Object)
GetType()

현재 인스턴스의 Type을 가져옵니다.

(다음에서 상속됨 Object)
MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.

(다음에서 상속됨 Object)
ToString()

현재 개체를 나타내는 문자열을 반환합니다.

(다음에서 상속됨 Object)
TryEnter()

기다리지 않고 잠금을 입력하려고 시도합니다.

TryEnter(Int32)

잠금을 입력할 수 있을 때까지 지정된 시간(밀리초)에 대해 필요한 경우 대기하여 잠금을 입력하려고 시도합니다.

TryEnter(TimeSpan)

잠금을 입력할 수 있을 때까지 또는 지정된 시간 제한이 만료될 때까지 필요한 경우 대기하여 잠금을 입력하려고 시도합니다.

적용 대상