My Study/System

Critical Section(임계 영역) - Semaphore

  드디어 동기화 중 가장 많이 들어본 Semaphore 이다 ㅋㅋㅋ


  Semaphore(이하 세마포어)는 뮤텍스랑 거의 비슷한데 차이가 있다면 임계 영역에 접근하는 쓰레드 개수를 정할 수 있다는 점이다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
HANDLE Semaphore;
DWORD eating[50];
 
unsigned int WINAPI ThreadProc(LPVOID lpParam)
{
    WaitForSingleObject(Semaphore, INFINITE);
    printf("초밥        :%d \n", GetCurrentThreadId());
    Sleep(100 * (DWORD)lpParam);
    ReleaseSemaphore(Semaphore, 1NULL);
    printf("잘먹었슴다!!\n");
    return 0;
}
 
int _tmain()
{    //나머지 코드 생략
    Semaphore = CreateSemaphore(NULL1010NULL);
    if (Semaphore == NULL)
        _tprintf(_T("CreateSemaphore Func err : %d"), GetLastError());
 
    for (int i = 0; i < 50; i++)
    {
        hThreads[i] = (HANDLE)_beginthreadex(NULL0,
            ThreadProc,
            (void*)eating[i],
            0,
            (unsigned*)&dwThreadIDs[i]);
        if (hThreads[i] == NULL)
            _tprintf(_T("_beginthreadex Func err : %d"), GetLastError());
    }
 
    WaitForMultipleObjects(50, hThreads, true, INFINITE);
 
    CloseHandle(Semaphore);
}
cs


  코드를 보면 뮤텍스와 매우 비슷하다  세마포어를 생성하고 WaitForSingleObject 로 세마포어를 non-signaled 상태로 임계 영역에 들어가 ReleaseSemaphore 에서 signaled 가 된다. 여기서 쓰레드가 CreateSemaphore 의 설정한 파라미터에 따라 동작하는 쓰레드 수가 다르다. 


HANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, _In_     LONG                  lInitialCount, _In_     LONG                  lMaximumCount, _In_opt_ LPCTSTR               lpName );

출처 : CreateSemaphore MSDN


세마포어를 생성하는 API인데 역시나 보안 속성을 정하는 것이 있고 반환 값이 핸들이다. 커널 오브젝트가 생성되고 핸들 상속에 대한 설정이다. 두번째 파라미터는 임계 영역에 접근 가능한 쓰레드 개수를 제한하는 파라미터이다. 세번째 파라미터는 세마포어가 지닐 수 있는 값의 최대 크기 이다. 이 값은 두번째 파라미터 값보다 커야한다. 마지막으로는 세마포어에 이름을 붙이는 파리미터이다. 


  임계 영역은 Mutex와 동일하게 WaitForSingleObject 와 ReleaseSemaphore로 제어한다. 

BOOL WINAPI ReleaseSemaphore(
  _In_      HANDLE hSemaphore,
  _In_      LONG   lReleaseCount,
  _Out_opt_ LPLONG lpPreviousCount
);

출처 : ReleaseSemaphore MSDN

  첫번째는 초기화한 세마포어를 넣어주고 두번째는 세마포어 카운트의 증가 값을 결정함. 세번째는 변경되기 전 세마포어 카운트를 저장할 변수를 지정한다.


  



최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.