2.4상호 배제
경쟁 조건 문제를 해결하기 위해서 상호 배제(mutual exclusion)를 사용합니다. 상호 배제의 원리는 매우 간단합니다. 스레드 하나가 공유 자원을 이용하는 동안에는 다른 스레드가 접근하지 못하게 막는 것입니다. 이전 절에서 만든 예제를 수정하여 상호 배제를 구현해 봅시다. 파이썬에서는 주로 Lock 객체를 활용합니다.
코드 10-4 process_thread/multithread_mutex.py
import threading g_count = 0 def thread_main(): global g_count # Lock을 획득 # 한 스레드가 획득하면 # 획득을 시도한 나머지 스레드는 대기 lock.acquire() #2 for i in range(100000): g_count += 1 # Lock을 반환 # 획득했던 스레드가 반환하면 # 대기하던 스레드 중 하나가 획득 lock.release() #3 # Lock 객체 생성 lock = threading.Lock() #1 threads = [ ] for i in range(50): th = threading.Thread(target = thread_main) threads.append(th) for th in threads: th.start() for th in threads: th.join() print('g_count : {:,}'.format(g_count))
실행결과 g_count : 5,000,000