내용 보기
작성자
관리자 (IP : 106.247.248.10)
날짜
2024-07-29 08:25
제목
[C#] [스크랩] C# 13 - (3) Monitor를 대체할 Lock 타입
지난 2개의 글에서 살펴본 것과는 달리 이번에는 Visual Studio 2022 버전과 .NET 9 SDK (Preview 6 이상)도 함께 설치해야 테스트를 할 수 있습니다.
New lock object ; https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-13#new-lock-object [Proposal]: Lock statement pattern #7104 ; https://github.com/dotnet/csharplang/issues/7104
Lock Class ; https://learn.microsoft.com/en-us/dotnet/api/system.threading.lock?view=net-9.0
public sealed class Lock
{
public Lock();
public bool IsHeldByCurrentThread { get; }
public void Enter();
public Scope EnterScope();
public void Exit();
public bool TryEnter();
public bool TryEnter(int millisecondsTimeout);
public bool TryEnter(TimeSpan timeout);
public ref struct Scope
{
public void Dispose();
}
}
public static class Monitor
{
public static long LockContentionCount { get; }
public static void Enter(object obj);
public static void Enter(object obj, ref bool lockTaken);
public static void Exit(object obj);
public static bool IsEntered(object obj);
// ...[생략]...
}
{ object objLock = new(); Monitor.Enter(objLock); // ... 공유 자원 read/write ... Monitor.Exit(objLock); }
{ System.Threading.Lock objLock = new(); objLock.Enter(); // ... 공유 자원 read/write ... objLock.Exit(); }
Lock lockObj = new();
using (lockObj.EnterScope())
{
// ... 공유 자원 read/write ...
}
Lock lockObj = new(); System.Threading.Lock.Scope scope = lockObj.EnterScope(); try { // ... 공유 자원 read/write } finally { scope.Dispose(); }
{ object objLock = new(); lock (objLock) { // ... 공유 자원 read/write ... } }
{ Lock lockObj = new(); lock (lockObj) // C# 13 컴파일러는 대상 개체가 Lock 타입임을 인식 { // ... 공유 자원 read/write ... } }
{
Lock lockObj = new();
using (lockObj.EnterScope()) // 최종적으로는 try/finally의 Scope.Dispose()를 호출하는 구문으로 바뀜
{
// ... 공유 자원 read/write ...
}
}
C# - async 메서드에서의 System.Threading.Lock 잠금 처리 ; https://www.sysnet.pe.kr/2/0/13698
// C# 12 이하에서 컴파일하는 경우 { Lock lockObj = new(); lock (lockObj) // 분명히 Lock 타입도 참조형이지만 컴파일 오류 발생 { Console.WriteLine("locked by object"); } }
Interrupt can interrupt threads that are waiting to enter a lock. On Windows STA threads, waits for locks allow message pumping that can run other code on the same thread during a wait. ... A thread that enters a lock, including multiple times such as recursively, must exit the lock the same number of times to fully exit the lock and allow other threads to enter the lock.
Visual Studio - ATL Simple Object 추가 시 error C2065: 'IDR_...': undeclared identifier ; https://www.sysnet.pe.kr/2/0/13686
개발 환경 구성: 717. Visual Studio - C# 프로젝트에서 레지스트리에 등록하지 않은 COM 개체 참조 및 사용 방법 ; https://www.sysnet.pe.kr/2/0/13693
C# - Lock / Wait 상태에서도 일부 Win32 메시지 처리 ; https://www.sysnet.pe.kr/2/0/13688 C# - Lock / Wait 상태에서도 STA COM 메서드 호출 처리 ; https://www.sysnet.pe.kr/2/0/13695
C# - PostThreadMessage로 보낸 메시지를 Windows Forms에서 수신하는 방법 ; https://www.sysnet.pe.kr/2/0/13687 Windbg - 스레드의 Win32 Message Queue 정보 조회 ; https://www.sysnet.pe.kr/2/0/13691
C# - async 메서드에서의 lock/Monitor.Enter/Exit 잠금 처리 ; https://www.sysnet.pe.kr/2/0/13697 C# - async 메서드에서의 System.Threading.Lock 잠금 처리 ; https://www.sysnet.pe.kr/2/0/13698 |
출처1
https://www.sysnet.pe.kr/2/0/13699
출처2