티스토리 뷰
1. 임계 영역.
CRITICAL_SECTION CMyCriticalSection::m_CS; CMyCriticalSection::CMyCriticalSection(void) { } CMyCriticalSection::~CMyCriticalSection(void) { } void CMyCriticalSection::Initialize(void) { InitializeCriticalSection(&m_CS); m_hThread = (HANDLE)_beginthreadex(0, 0, ThreadFunc, this, 0, 0); } void CMyCriticalSection::Progress(void) { WaitForSingleObject(m_hThread, INFINITE); CloseHandle(m_hThread); DeleteCriticalSection(&m_CS); } unsigned int WINAPI CMyCriticalSection::ThreadFunc(void* _pArg) { CMyCriticalSection* pTemp = (CMyCriticalSection*)_pArg; EnterCriticalSection(&m_CS); for (int i = 0; i < 10; ++i) cout << i << endl; LeaveCriticalSection(&m_CS); _endthreadex(0); return 0; }
2. 뮤텍스.
HANDLE CMyMutex::m_Mutex; CMyMutex::CMyMutex(void) { } CMyMutex::~CMyMutex(void) { } void CMyMutex::Initialize(void) { m_Mutex = CreateMutex(NULL, FALSE, NULL); m_hThread = (HANDLE)_beginthreadex(0, 0, ThreadFunc, this, 0, 0); } void CMyMutex::Progress(void) { WaitForSingleObject(m_hThread, INFINITE); CloseHandle(m_hThread); CloseHandle(m_Mutex); } unsigned int WINAPI CMyMutex::ThreadFunc(void* _pArg) { CMyMutex* pTemp = (CMyMutex*)_pArg; AcquireMutex(m_Mutex); for (int i = 10; i < 20; ++i) cout << i << endl; ReleaseMutex(m_Mutex); _endthreadex(0); return 0; } DWORD CMyMutex::AcquireMutex(HANDLE _Mutex) { return WaitForSingleObject(_Mutex, INFINITE); }
3. 세마포어.
HANDLE CMySemaphore::m_Semaphore; CMySemaphore::CMySemaphore(void) { } CMySemaphore::~CMySemaphore(void) { } void CMySemaphore::Initialize(void) { m_Semaphore = CreateSemaphore(NULL, 1, 1, NULL); m_hThread = (HANDLE)_beginthreadex(0, 0, ThreadFunc, this, 0, 0); } void CMySemaphore::Progress(void) { WaitForSingleObject(m_hThread, INFINITE); CloseHandle(m_hThread); CloseHandle(m_Semaphore); } unsigned int WINAPI CMySemaphore::ThreadFunc(void* _pArg) { CMySemaphore* pTemp = (CMySemaphore*)_pArg; AcquireSemaphore(m_Semaphore); for (int i = 20; i < 30; ++i) cout << i << endl; ReleaseSemaphore(m_Semaphore, 1, NULL); _endthreadex(0); return 0; } DWORD CMySemaphore::AcquireSemaphore(HANDLE _Semaphore) { return WaitForSingleObject(_Semaphore, INFINITE); }
4. 이벤트.
HANDLE CMyEvent::m_Event; CMyEvent::CMyEvent(void) { } CMyEvent::~CMyEvent(void) { } void CMyEvent::Initialize(void) { m_Event = CreateEvent(NULL, TRUE, FALSE, NULL); m_hThread = (HANDLE)_beginthreadex(0, 0, ThreadFunc, this, 0, 0); } void CMyEvent::Progress(void) { SetEvent(m_Event); WaitForSingleObject(m_hThread, INFINITE); CloseHandle(m_Event); CloseHandle(m_hThread); } unsigned int WINAPI CMyEvent::ThreadFunc(void* _pArg) { CMyEvent* pTemp = (CMyEvent*)_pArg; AcquireEvent(m_Event); for (int i = 30; i < 40; ++i) cout << i << endl; _endthreadex(0); return 0; } DWORD CMyEvent::AcquireEvent(HANDLE _Event) { return WaitForSingleObject(_Event, INFINITE); }
댓글
공지사항