14. [pywin32] ReleaseMutex 함수

pywin32/win32event|2020. 9. 18. 00:46

ReleaseMutex(hEvent)

 

CreateMutex나 OpenMutex로 만든 뮤텍스의 점유를 해제하는 함수입니다.

 

인자로는 hEvent : PyHANDLE 가 있습니다.

 

hEvent는 뮤텍스의 핸들값입니다.

 

 

import threading
import win32event
import win32con
import win32api

total=0
mHandle=0


def sum(num):
    global total
    global mHandle

    
    win32event.WaitForSingleObject(mHandle, win32event.INFINITE)
    # 여기와

    for i in range(100000):    
        total+=1

    win32event.ReleaseMutex(mHandle)
    # 여기를 지우고 실행시키면 결과가 달라집니다.
    
    print(f"Subthread {num} : {total}\n")

x = win32event.CreateMutex(None, win32con.FALSE, "mutexTest")
# win32event.ReleaseMutex(x)

mHandle=win32event.OpenMutex(win32event.SYNCHRONIZE, win32con.FALSE, "mutexTest")

t = threading.Thread(target=sum, args=(1,))
t2 =  threading.Thread(target=sum, args=(2,))
t.start()
t2.start()

print("Main Thread\n")

win32api.CloseHandle(mHandle)
win32api.CloseHandle(x)

갑자기 코드가 늘어났습니다.ㅎㅎ

먼저 threading 모듈은 파이썬에서 쓰레드를 생성시켜주는 모듈입니다. 뮤텍스의 사용에 대한 설명을 하기 위해서는 쓰레드가 필요해서 넣었습니다.

 

간단히 설명하자면, 두개의 쓰레드가 total이라는 하나의 변수에 값을 1씩 계속 더하는 코드입니다. 문제는 두개의 쓰레드가 total 변수에 동시에 접근할 떄 값이 제대로 더해지지 않는 경우가 생긴다는 겁니다. 이런 경우를 위해서 뮤텍스를 이용해 쓰레드의 동시 접근을 막고 하나만 접근할 수 있게 합니다.

 

위의 결과가 뮤텍스를 이용했기 때문에 제대로 total이 증가한 상황입니다.

 

만약 코드에서 표시한 부분(뮤텍스 부분)을 주석처리한 후 실행한다면 위처럼 total이 제대로 증가하지 않을 것입니다.

 

 

반응형

'pywin32 > win32event' 카테고리의 다른 글

16. [pywin32] OpenSemaphore 함수  (0) 2020.09.20
15. [pywin32] CreateSemaphore 함수  (0) 2020.09.19
13. [pywin32] OpenMutex 함수  (0) 2020.09.17
12. [pywin32] CreateMutex 함수  (0) 2020.09.16
11. [pywin32] SetWaitableTimer 함수  (0) 2020.09.12

댓글()