본문 바로가기

Hello CE,Mobile

CreateSemaphore


HANDLE CreateSemaphore(

  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,

  LONG lInitialCount, /* 임계영역 갯수              */

  LONG lMaximumCount, /* 임계영역 접근 갯수          */

  LPCTSTR lpName      /* Mutex 와 동일하게 Name 지정 */

);




● Initial #1

   m_hMuxMsgSemaphore = CreateSemaphore(NULL, 1(화장실), 5(키), NULL);

Key

Key

Key

Key

Key

화장실(임계영역)

WaitForSingleObject(m_hMuxMsgSemaphore, INFINITE);  /* 화장실에 들어감 */

...

...

ReleaseSemaphore(m_hMuxMsgSemaphore, 1, NULL); /* 화장실에서 나감 */


● Description

임계영역을 1로 지정하고 임계접근 갯수를 5로 설정.

WaitForSingleObject 만났을 경우 현재 화장실이 비어 있기 때문에 키를 가진 한사람이 접근 할 수 있다. 만약 화장실을 이용하게 된다면 현재 사람은 4명이 대기 하고 있다.

  

Key

Key

Key

Key

화장실


ReleaseSemaphore 를 하기 전까지 대기 하고 있는 사람들은 화장실을 들어갈 수가 없기 때문에 화장실에 대한 완벽한 동기화가 이루어지며, ReleaseSemaphore 통하여 화장실에서 나감으로 써 현재 5명이 대기하게 된다.


Key

Key

Key

Key

Key

화장실

화장실이 비어 있는 상태이기 때문에 뒤에서 기다리고 있던 사람중 누구나 들어갈 수 있는 상태가 된다.


● Initial #2

m_hMuxMsgSemaphore = CreateSemaphore(NULL, 3(화장실), 3(키), NULL);

 

Key

Key

Key

화장실

화장실

화장실


WaitForSingleObject(m_hMuxMsgSemaphore, INFINITE);  /* 화장실에 들어감 */

...

...

ReleaseSemaphore(m_hMuxMsgSemaphore, 1, NULL); /* 화장실에서 나감 */


● Description

임계영역과 접근 Count 가 동시에 설정 되어 있기 때문에 [그림1] 처럼 임계영역에 각각 접근이 가능하기도 하고, [그림2] 처럼 1,2번 화장실 만 이용하고 남은 대기인원이 1번 화장실을 이용하려고 대기하는 상황등 여러가지 면에서 발생 할 수 있다. 


[그림1]

화장실

화장실

화장실

 

[그림2]

Key

1화장실

2화장실

3화장실



● in Conclusion

WaitForSingleObject  세마포어 Count 를 증가.

ReleaseSemaphore  세마포어 Count 를 감소.

Count 최종적으로 0 이면 되면 Lock.




==========================================================================================


==========================================================================================

parameters

lpSemaphoreAttributes

[in] Set to NULL.

lInitialCount

[in] Specifies an initial count for the semaphore object. This value must be greater than or equal to zero and less than or equal to lMaximumCount. The state of a semaphore is signaled when its count is greater than zero and nonsignaled when it is zero. The count is decreased by one whenever a wait function releases a thread that was waiting for the semaphore. The count is increased by a specified amount by calling the ReleaseSemaphore function.

lMaximumCount

[in] Specifies the maximum count for the semaphore object. This value must be greater than zero.

lpName

[in] Long pointer to a null-terminated string specifying the name of the semaphore object. The name is limited to MAX_PATH characters and can contain any character except the backslash path-separator character (\). Name comparison is case sensitive.

If lpName matches the name of an existing named semaphore object, the lInitialCount and lMaximumCount parameters are ignored because they have already been set during the creation process.

Each object type, such as memory maps, semaphores, events, message queues, mutexes, and watchdog timers, has its own separate namespace. Empty strings ("") are handled as named objects. On Windows desktop-based platforms, synchronization objects all share the same namespace.

Return Value

A handle to the semaphore object indicates success. If the named semaphore object existed before the function call, the GetLastError function returns ERROR_ALREADY_EXISTS. Otherwise, GetLastError returns zero.

NULL indicates failure. To get extended error information, call GetLastError.


[출처] MSDN







'Hello CE,Mobile' 카테고리의 다른 글

IMEI Windows Mobile  (0) 2012.09.18
uldr.nb0  (0) 2012.08.31
TouchCalibrate()  (0) 2012.07.25
CE,Mobile 설치 상대경로  (0) 2012.07.16
COMSTAT  (0) 2012.07.12