[c#] C# 스레드 보호
C#에서 다중 스레드를 사용할 때 스레드 보호는 매우 중요합니다. 여러 스레드가 동시에 전역 변수나 리소스를 수정하는 경우 데이터 일관성 및 안전성 문제가 발생할 수 있습니다. 여기에는 몇 가지 기술이 있습니다.
lock 키워드를 사용한 스레드 보호
lock
키워드는 코드 블록을 한 번에 하나의 스레드만 실행되도록 합니다. 다른 스레드가 lock
블록에 들어가려고 하면 해당 스레드는 대기 상태로 들어가며, 이미 lock
된 블록이 해제될 때까지 대기해야 합니다.
class Program
{
private static object _lock = new object();
static void Main()
{
lock (_lock)
{
// 보호가 필요한 코드
}
}
}
Monitor 클래스를 사용한 스레드 보호
Monitor
클래스는 lock
키워드보다 더 세밀한 제어를 제공합니다. Monitor.Enter
및 Monitor.Exit
메서드를 사용하여 감시하고자 하는 리소스에 대한 락을 설정하고 해제합니다.
class Program
{
private static object _lock = new object();
static void Main()
{
Monitor.Enter(_lock);
try
{
// 보호가 필요한 코드
}
finally
{
Monitor.Exit(_lock);
}
}
}
Semaphore나 Mutex 사용하기
Semaphore
나 Mutex
를 사용하여 보호가 필요한 코드 영역에 진입 가능한 스레드의 수를 제어할 수 있습니다. 이를 통해 동시에 여러 스레드가 접근해도 안전하게 작업할 수 있습니다.
class Program
{
private static Semaphore _semaphore = new Semaphore(1, 1);
static void Main()
{
_semaphore.WaitOne();
try
{
// 보호가 필요한 코드
}
finally
{
_semaphore.Release();
}
}
}
이러한 방법들을 사용하여 C#의 다중 스레드 환경에서 데이터를 안전하게 보호할 수 있습니다.
참고:
- https://docs.microsoft.com/en-us/dotnet/api/system.threading.monitor?view=net-5.0
- https://docs.microsoft.com/en-us/dotnet/api/system.threading.semaphore?view=net-5.0