프로세스 내부에서의 임계영역 설정 (운영체제에서 관리 x - 빠른 속도) - Monitor, lock
object obj = new object(); //타겟 오브젝트
// 1) Monitor와 같은 역할
lock (obj)
{
//do something
}
// 2) lock과 같은 역할
Monitor.Enter(obj)
//do something
Monitor.Exit(obj)
다른 프로세스 간 임계영역 설정 (운영체제에서 관리) - Mutex, Semaphore, EventWaitHendle
1) Mutex, Semaphore (1개면 Mutex와 동일)
using System;
using System.Threading;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
//1) 뮤텍스가 이미 있는지 확인
bool isExist;
Mutex mutex2 = new Mutex(true, "Test2", out isExist); //시작이 true면 바로 락 (WaitOne 효과)
if (isExist)
{
//이미 존재하는 뮤텍스...
}
else
{
//존재하지 않는 뮤텍스..
}
mutex2.ReleaseMutex();
mutex2.Dispose();
//*******************************************
//2)
Mutex mutex = new Mutex(false, "Test"); //시작이 false면 최초 락 걸지 않음 (WaitOne 필요)
//************************************
//(WaitOne 성공 시 true, 다른 곳에서 사용 중이면 false)
//bool canUse = mutex.WaitOne(5000); //5초 기다리고 바로 실행
//bool canUse = mutex.WaitOne(0); //바로 사용 가능한지 확인
//************************************
mutex.WaitOne(); //사용 가능할 때까지 대기
Console.WriteLine("{0} : 임계영역 설정", DateTime.Now);
Console.ReadLine();
mutex.ReleaseMutex(); //임계영역 해제
mutex.Dispose(); //메모리 누수 방지를 위해 Dispose 혹은 using 필요!
Console.WriteLine("{0} : 임계영역 해제", DateTime.Now);
Console.ReadLine();
}
}
}
(GPT 대답)
- createdNew는 뮤텍스가 "생성됐는지" 여부
- WaitOne(0)는 뮤텍스 "소유권을 즉시 획득할 수 있는지" 여부
EventWaitHendle 도 있는데 나중에 정리..
'C# > 기타' 카테고리의 다른 글
[C#] 프로그램 중복 실행 방지 (Mutex) (0) | 2025.04.09 |
---|---|
[C#] Visual Studio 스크롤 시 화면 깨짐 (옵션 설정) (0) | 2024.02.10 |
[C#] IComparer 정렬 (클래스, 구조체 정렬) (0) | 2023.10.24 |
[C#] 출력 형식 ToString("C D N F E X") (+2진수 8진수 16진수) (0) | 2022.10.10 |
[C#] 인덱서 Indexer (0) | 2022.07.11 |