엔지니어 블로그

[Python] Threading #1 Mutex로 스레드 제어 본문

Programming Language/Python

[Python] Threading #1 Mutex로 스레드 제어

안기용 2025. 4. 1. 12:04

운영체제의 동기화를 공부하며 SpinLock,Mutex,Semaphore를 알게 되었고, python에서는 어떻게 구현되는지 궁금하여 직접 구현해봤습니다. 파이썬의 라이브러리를 활용했고, SpinLock은 라이브러리가 없어 mutex,semaphore만 다룰 예정입니다. 또, 각각의 개념에 대해서는 따로 포스팅을 할 것이기 때문에 본 글에서는 소개하지 않습니다.

구현 환경

  • Python 3.9.6

구현 내용

  • 멀티 스레드 환경에서 숫자를 1씩 더해가는 작업을 통해 스레드 작업을 진행 후 결과 값을 비교
  • 총 4개의 스레드에서 10000000 번을 1씩 더하는 코드

코드

import threading

#전역변수
shared_counter_without_lock = 0 
shared_counter_with_lock = 0

#lock 없이 1씩 더하는 작업 함수
def increment_without_lock(thread_id,num):
    global shared_counter_without_lock
    for _ in range(num):
        shared_counter_without_lock += 1

def increment_with_lock(thread_id,num):
    global shared_counter_with_lock
    for _ in range(num):
        with lock:
            shared_counter_with_lock += 1

def run(num_threads,num):
    global hared_counter_without_lock,shared_counter_with_lock

    #without lock
    shared_counter_with_lock = 0
    threads = []
    for i in range(num_threads):
        t = threading.Thread(target=increment_with_mutex,args=(i,num))
        threads.append(t)
        t.start()
    for t in threads:
        t.join()

    #with lock
    print(f"[뮤텍스 사용] 결과: {shared_counter_with_lock}")

    # without mutex
    shared_counter_without_lock = 0
    threads = []
    for i in range(num_threads):
        t = threading.Thread(target=increment_without_mutex,args=(i,num))
        threads.append(t)
        t.start()
    for t in threads:
        t.join()
    print(f"[뮤텍스 미사용] 결과: {shared_counter_without_lock}")

if __name__ == "__main__":
    run(4,10000000)

결과

  • lock 사용시 예상 값 출력
  • lock 미사용시 이상한 값 출력
    [뮤텍스 사용] 결과: 40000000
    [뮤텍스 미사용] 결과: 15956238

 


2025.04.01 - [글공부] - [OS] 멀티 스레딩 환경의 동기화

 

'Programming Language > Python' 카테고리의 다른 글

[Python] CPython  (0) 2025.03.14
[Python] Dictionary 정렬  (0) 2025.03.10