세마포어 (SemaPhore)
- Mutex 동기화와 비슷한 임계영역 동기화 기법
- Semaphore 오브젝트의 소멸도CloseHandle 함수호출 통해서 이루어짐
- 세마포어 값이 0 인 경우 -> non- signaled
세마포어 값이 0보다 큰 경우 -> signaled
#include <windows.h>
HANDLE CreateSemaphore(보안꽌련 정보, 초기값, 최댓값, 세마포어 이름)
#include <windows.h>
BOOL ReleaseSemaphore(반납할obj, 초기값변경, 이전 세마포어값저장주소)
- 세마포어 기반 동기화의 형태
WaitFosingleObject(hSemaphore, INFINITE);
//임계영역의 시작
//.....
//임계영역의 끝
ReleaseSemaphore(hSemaphore, 1, NULL);
이벤트 (Event)
- 자동으로 non-signaled 상태로 돌아가지 않는 manual - reset 모드 커널 오브젝트로 생성 가능
- 앞서 보인 함수들은 auto-reset모드로 커널 오브젝트를 생성해 자동으로 signaled <--> non - signaled 변환
- manual - reset 모드로 이벤트 오브젝트를 생성시, 이벤트 상태 변경
#include < windows.h>
BOOL ResetEvent(HANDLE hEvent); // to the non-signaled
BOOL SetEvent(HANDLE hEvent); // to the signaled
// BOOL -> 성공 TRUE, 실패 FALSE
- 이벤트 기반 동기화의 예
static char str[STR_LEN];
static HANDLE hEvent;
int main()
{
HANDLE hThread1, hThread2; //쓰레드 생성
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
//2번째 매개변수가 TRUE -> manual-reset
hThread1 = (HANDLE)_beginthreadex(NULL, 0, NumberOfA, NULL, 0 ,NULL);
hThread2 = (HANDLE)_beginthreadex(NULL, 0, NumberofOthers, NULL, 0, NULL);
....
SetEvent(hEvent);
// Signaled상태로 변경, 두 쓰레드를 깨움
waitForSingleobject(hThread1, INFINITE);
waitForSingleobject(hThread2, INFINITE);
ResetEvnet(hEvent); // -> non signaled
CloseHandle(hEvent);
return 0
}
usigned WINAPI NumberOf(void *arg)
{
....
waitForSingleobject(hEvent, INFINITE); //임계영역 진입
...
}