여러개의 쓰레드가 동시에 하나의 변수를 변경시켜줄 때, 문제가 생기는 것을 방지하기 위해 쓰레드에 순위를 매겨서 처리하는 방식의 세마포어와는 달리 뮤텍스는 쓰레드가 들어오는 순서대로 처리해 주는 방식으로 사용한다.
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)되기를 기다리게 된다.
'프로그래밍 > 예전글' 카테고리의 다른 글
vmWare를 이용하여 Linux 설치(Fedora) - 3 (0) | 2010.08.13 |
---|---|
vmWare를 이용하여 Linux 설치(Fedora) - 2 (0) | 2010.08.12 |
vmWare를 이용하여 Linux 설치(Fedora) - 1 (0) | 2010.08.12 |
GetMessage함수와 PeekMessage함수 그리고 데드타임 (0) | 2010.04.01 |
Direct3D9 랜더링파이프라인 (0) | 2010.02.26 |