17. [pywin32] ReleaseSemaphore 함수

pywin32/win32event|2020. 9. 21. 00:08

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")인 경우

 

 

반응형

댓글()