여러개의 쓰레드가 동시에 하나의 변수를 변경시켜줄 때, 문제가 생기는 것을 방지하기 위해 쓰레드에 순위를 매겨서 처리하는 방식의 세마포어와는 달리 뮤텍스는 쓰레드가 들어오는 순서대로 처리해 주는 방식으로 사용한다.
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)되기를 기다리게 된다.
'Notes > Tech History' 카테고리의 다른 글
| 리눅스 기본 명령어 (1) | 2010.08.17 |
|---|---|
| 소켓의 프로토콜 (socket함수를 파헤쳐보자) (0) | 2010.08.16 |
| 윈도우 기반의 소켓관련 함수 (0) | 2010.08.14 |
| WSADATA와 WSAStartup, 그리고 WSACleanup (0) | 2010.08.13 |
| GetMessage함수와 PeekMessage함수 그리고 데드타임 (0) | 2010.04.01 |
