Lock 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
서로 다른 스레드 간의 코드 영역에서 상호 배제를 달성하기 위한 메커니즘을 제공합니다.
public ref class Lock sealed
public sealed class Lock
type Lock = class
Public NotInheritable Class Lock
- 상속
-
Lock
설명
이 클래스는 Lock 리소스에 대한 동시 액세스를 방지하기 위해 일반적으로 중요한 섹션이라고 하는 프로세스의 스레드 간에 상호 배타적인 액세스가 필요한 코드 영역을 정의하는 데 사용할 수 있습니다. A Lock 를 입력하고 종료할 수 있습니다. 여기서 Enter와 Exit 사이의 코드 영역은 잠금과 관련된 중요한 섹션입니다. 잠금에 들어가는 스레드는 잠금을 종료할 때까지 잠금을 보유하거나 소유한다고 합니다. 최대 한 스레드는 지정된 시간에 잠금을 유지할 수 있습니다. 스레드는 여러 잠금을 보유할 수 있습니다. 스레드는 재귀적으로 종료하기 전에 잠금을 여러 번 입력할 수 있습니다. 잠금을 즉시 입력할 수 없는 스레드는 잠금이 입력될 때까지 또는 지정된 시간 제한이 만료될 때까지 기다릴 수 있습니다.
또는 TryEnter 메서드를 Enter 사용하여 잠금을 입력하는 경우:
- 블록을 사용하여 C#과 같은 예외가 있는 경우에도 스레드가 잠금 Exit 을
try/finally종료하는지 확인합니다. - C#
async메서드에서 잠금을 입력하고 종료하는 경우 Enter 및 Exit 사이에 잠금이 없는지await확인합니다. 잠금은 스레드에 의해 유지되며 다음 코드는await다른 스레드에서 실행될 수 있습니다.
C# using 키워드와 같이 반환 Lock.Scope 된 내용을 자동으로 삭제하는 언어 구문과 함께 메서드를 사용 EnterScope 하거나, 예외적인 경우 잠금이 종료되도록 C# lock 키워드를 사용하는 것이 좋습니다. 이러한 패턴은 사용 Enter/TryEnter 및 Exit사용보다 성능 이점이 있을 수도 있습니다. 다음 코드 조각에서는 잠금을 입력하고 종료하기 위한 다양한 패턴을 보여 줍니다.
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 키워드 또는 이와 유사한 키워드를 사용하여 잠금을 입력하고 종료하는 경우 식의 형식은 정확 System.Threading.Lock해야 합니다. 식의 형식이 다른 경우(예: Object 제네릭 형식 T) 교환할 수 없는 다른 구현을 대신 사용할 수 있습니다(예: Monitor). 자세한 내용은 관련 컴파일러 사양을 참조하세요.
Interrupt 는 잠금을 입력하기 위해 대기 중인 스레드를 중단할 수 있습니다. Windows STA 스레드에서 잠금을 대기하면 대기하는 동안 동일한 스레드에서 다른 코드를 실행할 수 있는 메시지 펌핑이 허용됩니다. 대기의 일부 기능은 사용자 지정 SynchronizationContext에 의해 재정의될 수 있습니다.
메모
재귀적으로 같은 여러 번을 포함하여 잠금에 들어가는 스레드는 잠금을 완전히 종료하고 다른 스레드가 잠금에 들어갈 수 있도록 잠금을 동일한 횟수만큼 종료해야 합니다. 스레드가 홀딩 Lock하는 동안 종료되면 동작이 Lock 정의되지 않습니다.
주의
코드 경로에서 스레드가 여러 잠금을 종료하기 전에 입력할 수 있는 경우 동일한 스레드에서 두 잠금을 입력할 수 있는 모든 코드 경로가 동일한 순서로 입력되는지 확인합니다. 그렇지 않으면 교착 상태가 발생할 수 있습니다. 예를 들어 한 코드 경로 스레드 T1 에서 잠금 L1 을 입력한 다음 L2 잠금을 모두 종료하고 다른 코드 경로 스레드 T2 에서 두 잠금을 역순으로 입력하는 것이 좋습니다. 이 시나리오에서는 다음과 같은 이벤트 순서가 발생할 T1 수 있습니다. enter, T2L1entersL2, T1 enter L2 및 waits를 시도하고, 입력을 시도하고, T2 대기 L1 합니다. 그 사이에 T1 교착 상태가 있으며 T2 해결할 수 없으며 나중에 잠금을 입력하려는 다른 스레드도 중단됩니다.
생성자
| Name | Description |
|---|---|
| Lock() |
Lock 클래스의 새 인스턴스를 초기화합니다. |
속성
| Name | Description |
|---|---|
| IsHeldByCurrentThread |
잠금이 현재 스레드에 의해 유지되는지 여부를 나타내는 값을 가져옵니다. |
메서드
| Name | Description |
|---|---|
| Enter() |
잠금을 입력할 수 있을 때까지 필요한 경우 대기하여 잠금을 입력합니다. |
| EnterScope() |
잠금을 입력할 수 있을 때까지 필요한 경우 대기하여 잠금을 입력합니다. |
| Equals(Object) |
지정된 개체가 현재 개체와 같은지 여부를 확인합니다. (다음에서 상속됨 Object) |
| Exit() |
잠금을 종료합니다. |
| GetHashCode() |
기본 해시 함수로 사용됩니다. (다음에서 상속됨 Object) |
| GetType() |
현재 인스턴스의 Type 가져옵니다. (다음에서 상속됨 Object) |
| MemberwiseClone() |
현재 Object단순 복사본을 만듭니다. (다음에서 상속됨 Object) |
| ToString() |
현재 개체를 나타내는 문자열을 반환합니다. (다음에서 상속됨 Object) |
| TryEnter() |
기다리지 않고 잠금을 입력하려고 시도합니다. |
| TryEnter(Int32) |
잠금을 입력할 수 있을 때까지 지정된 시간(밀리초)에 대해 필요한 경우 대기하여 잠금을 입력하려고 시도합니다. |
| TryEnter(TimeSpan) |
잠금을 입력할 수 있을 때까지 또는 지정된 시간 제한이 만료될 때까지 필요한 경우 대기하여 잠금을 입력하려고 시도합니다. |