17. [pywin32] ReleaseSemaphore 함수
int = ReleaseSemaphore(hEvent, lReleaseCount )
WaitForSingleObject로 점유한 세마포어의 점유를 해제하는 함수입니다.
인자로는 hEvent : PyHANDLE, lReleaseCount : int 가 있습니다.
hEvent는 세마포어의 핸들 값입니다.
lReleaseCount는 세마포어 점유 해제 시 카운트를 몇을 증가시킬 지 정합니다. 기본적으로 1로 설정하는 듯 합니다.
- WaitForSingleObject로 세마포어를 점유 시 세마포어의 카운트가 1씩 감소합니다. 현재 예제에서는 최대 카운트가 2, 초기 카운트가 1이였으니 WaitForSingleObject을 한번 호출하면 세마포어의 카운트가 0이 되면서 다른 쓰레드가 접근을 하지 못하게 됩니다.
return 값은 세마포어를 점유 해제하기 전 세마포어의 카운트 값입니다.
import threading
import win32event
import win32con
import win32api
total=0
sHandle=0
def sum(num):
global total
global sHandle
win32event.WaitForSingleObject(sHandle, win32event.INFINITE)
for i in range(100000):
total+=1
pCnt = win32event.ReleaseSemaphore(sHandle, 1)
print(f"Subthread {num} : {total}\n")
x = win32event.CreateSemaphore(None, 1, 2, "semaTest")
sHandle=win32event.OpenSemaphore(win32event.EVENT_ALL_ACCESS, win32con.FALSE, "semaTest")
t = threading.Thread(target=sum, args=(1,))
t2 = threading.Thread(target=sum, args=(2,))
t.start()
t2.start()
print("Main Thread\n")
win32api.CloseHandle(sHandle)
win32api.CloseHandle(x)
위의 예제는 Mutex 예제와 동일하게 동작합니다. 하지만, x = win32event.CreateSemaphore(None, 1, 2, "semaTest") 이 부분을 x = win32event.CreateSemaphore(None, 2, 2, "semaTest")로 바꿔서 실행시켜 보시면, 쓰레드 2개가 동시에 total 변수에 접근이 가능해져서 계산 결과가 이상하게 나오게 됩니다.
x = win32event.CreateSemaphore(None, 1, 2, "semaTest")인 경우
x = win32event.CreateSemaphore(None, 2, 2, "semaTest")인 경우
'pywin32 > win32event' 카테고리의 다른 글
19. [pywin32] WaitForSingleObjectEx 함수 (0) | 2020.09.23 |
---|---|
18. [pywin32] WaitForMultipleObjects 함수 (0) | 2020.09.22 |
16. [pywin32] OpenSemaphore 함수 (0) | 2020.09.20 |
15. [pywin32] CreateSemaphore 함수 (0) | 2020.09.19 |
14. [pywin32] ReleaseMutex 함수 (0) | 2020.09.18 |