프로그래밍/예전글

C++ Mutex Class

Cat체셔 2010. 2. 8. 15:07

 여러개의 쓰레드가 동시에 하나의 변수를 변경시켜줄 때, 문제가 생기는 것을 방지하기 위해 쓰레드에 순위를 매겨서 처리하는 방식의 세마포어와는 달리 뮤텍스는 쓰레드가 들어오는 순서대로 처리해 주는 방식으로 사용한다.



class CMutex
{
private:
    static HANDLE m_mutex;    //뮤텍스 핸들
    DWORD m_owner; //지금 Lock되어있는 Thread ID값
public:
    static void Init();
    static void Remove();
    CMutex();
    ~CMutex();
    void Lock();
    void Unlock();
};

void CMutex::Init()
{
    m_mutex = CreateMutex(NULL,FALSE,NULL);
    memset(&m_owner, 0, sizeof(DWORD));
}
void CMutex::Remove()
{
    WaitForSingleObject(m_mutex,INFINITE);
    CloseHandle(m_mutex);
}

CMutex::CMutex()
{
}

CMutex::~CMutex()
{
}

void CMutex::Lock()
{
 DWORD ThreadID = GetCurrentThreadId();
    if(m_owner != ThreadID)
    {
        WaitForSingleObject(m_mutex,INFINITE);
        m_owner = ThreadID;<br />
    }
}

void CMutex::UnLock()
{
    DWORD ThreadID = GetCurrentThreadId();
    if(m_owner == ThreadID)
    {
        ReleaseMutex(m_mutex);
        memset(&m_owner,0,sizeof(DWORD));
    }
}
 

 쓰레드에서 다른 쓰레드와 공유중인 변수를 쓰기전에 Lock()로 막아 놓으면 WaitForSingleObject(m_mutex,INFINITE)에 의해 다른 쓰레드는 뮤텍스가 ReleaseMutex(m_mutex)되기를 기다리게 된다.