내용 보기
작성자
관리자 (IP : 106.247.248.10)
날짜
2024-07-29 08:23
제목
[C#] [스크랩] async 메서드에서의 System.Threading.Lock 잠금 처리
.NET 9부터 새롭게 도입한 System.Threading.Lock 타입 역시 Monitor 및 Mutex와 그대로 치환이 됩니다. 즉, lock을 소유한 스레드를 알고 있으며 재진입에 따른 잠금 횟수를 관리합니다. internal class Program { static Lock _obj = new(); static void Main(string[] args) { _obj.Enter(); Thread t = new Thread(() => { _obj.Exit(); // 실행 시: System.Threading.SynchronizationLockException: 'The calling thread does not hold the lock.' }); t.Start(); t.Join(); } }
internal class Program { static Lock _obj = new(); static void Main(string[] args) { _obj.Enter(); _obj.Enter(); // 2번 잠금 Thread t = new Thread(() => { _obj.Enter(); // 다른 스레드에서 lock을 얻으려고 시도 Console.WriteLine("Thread 1"); _obj.Exit(); }); t.Start(); _obj.Exit(); // 한 번 잠금을 해제 Thread.Sleep(5000); _obj.Exit(); // 두 번 잠금을 해제 - 이 시점에 "Thread 1"이 출력됨 t.Join(); } }
internal class Program { static Lock _obj = new(); static async Task Main(string[] args) { lock (_obj) { await Task.Delay(2000); // error CS4007: Instance of type 'System.Threading.Lock.Scope' cannot be preserved across 'await' or 'yield' boundary. } } }
internal class Program { static Lock _obj = new(); static async Task Main(string[] args) { _obj.Enter(); await Task.Delay(2000); // 컴파일은 되지만, _obj.Exit(); // 실행 시: System.Threading.SynchronizationLockException: 'The calling thread does not hold the lock.' } }
Lock _obj = new(); private async void Form1_Load(object sender, EventArgs e) { _obj.Enter(); try { await Task.Delay(2000); } finally { _obj.Exit(); // SynchronizationContext에 따라 Enter를 호출한 스레드에서 Exit를 호출하므로 동기화 성공 } }
var scope = _obj.EnterScope();
try
{
await Task.Delay(2000);
}
finally
{
scope.Dispose(); // 컴파일 오류: error CS4007: Instance of type 'System.Threading.Lock.Scope' cannot be preserved across 'await' or 'yield' boundary.
}
|
출처1
https://www.sysnet.pe.kr/2/0/13698
출처2