Lock 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
참고
이 미리 보기 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#과 같은 예외가 있는 경우에도 스레드가 잠금 Exit 을
try/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) |
잠금을 입력할 수 있을 때까지 또는 지정된 시간 제한이 만료될 때까지 필요한 경우 대기하여 잠금을 입력하려고 시도합니다. |