티스토리 뷰



다중 쓰레드를 사용하는 프로그램에서 특정 자원이나 특정 코드에 대해서 동시 접근을 차단하고 한번에 하나의 쓰레드만 수행하도록 교통 정리할 필요가 있을 때 사용하는 자원이 뮤텍스(Mutex)입니다. 대표적인 IPC(Inter Process Communication) 자원으로 공유메모리, 메시지 큐와 함께 세마포어(Semaphore)가 있는데 뮤텍스는 값이 1인 세마포어라고도 할 수 있습니다. 세마포어는 통상 정수값을 가지고 프로세스가 접근할 수 있는 여유도를 지정한다면 뮤텍스는 값이 1이므로 한번에 단 하나의 프로세스나 쓰레드만 접근할 수 있도록 할 수 있는 것입니다. 뮤텍스는 프로그램 중복 실행 방지 보다는 실행중 자원 관리에 사용하는 것이 핵심 용도이지만 프로그램 중복 실행 방지를 통해서 뮤텍스 맛보기도 괜을듯 합니다.

C#에서 Mutex를 사용하려면 "using System.Threading;"으로 참조해야 합니다.

static class Program
{
    [STAThread]
    static void Main()
    {
        bool flagMutex;

        Mutex m_hMutex = new Mutex(true, "MySample", out flagMutex);

        if (flagMutex)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            MySample sample = new MySample();
            Application.Run(sample);
            m_hMutex.ReleaseMutex();
        }
        else
        {
            MessageBox.Show("Task already started!", "Error!");
        }
    }
}

위의 코드는 C# Windows Forms 프로그램의 시작점에서 뮤텍스를 활용하여 동일한 프로그램이 이미 실행중이면 오류 메시지를 출력하고 종료합니다. "new Mutex"로  뮤텍스 클래스의 새로운 인스턴스를 생성하는 시점에 두번째 인수로 전달한 뮤텍스 이름으로(예제에서는 프로그램 이름을 문자열로 지정함)가동중인 쓰레스가 없으면 해당 뮤텍스를 생성하면서 flagMutex로 True를 리턴합니다. 프로그램 실행중에는 해당 뮤텍스에 대한 소유권을 계속 가지고 있고 프로그램 종료 시점에 뮤텍스 인스턴스.ReleaseMutex()를 호출하는 것으로 소유권을 해제하는 방식입니다.

뮤텍스 사용 개념을 그림으로 정리하면 다음과 같습니다.




댓글
댓글쓰기 폼