프로세스 내부에서의 임계영역 설정 (운영체제에서 관리 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 도 있는데 나중에 정리..

+ Recent posts