뮤텍스는 상호 배제(mutual exclusion)를 보장하는 락으로, 한 번에 오직 하나의 스레드만 그것을 쥐고 보호된 임계 구역에 들어갈 수 있습니다. 세마포어는 이를 일반화하여 최대 N개의 동시 보유자를 허용합니다.
뮤텍스는 상호 배제(mutual exclusion)를 보장하는 락으로, 한 번에 오직 하나의 스레드만 그것을 쥐고 보호된 임계 구역에 들어갈 수 있습니다. 세마포어는 이를 일반화하여 최대 N개의 동시 보유자를 허용합니다.
acquire()는 감소시키고(0에서 블로킹), release()는 증가시킵니다. 뮤텍스는 본질적으로 N=1인 세마포어이지만 소유권 의미론이 추가된 것입니다.lock = threading.Lock()
def transfer(a, b, amt):
with lock: # critical section — one thread at a time
a.balance -= amt
b.balance += amt
# Semaphore: cap concurrent DB connections at 10
sem = threading.Semaphore(10)
def query():
with sem: # up to 10 threads run this concurrently
db.execute(...)
with/RAII/defer를 사용하세요.이것들은 공유 상태를 보호하는 일상적인 도구입니다. 뮤텍스는 경쟁을 막기 위해 접근을 직렬화하고, 세마포어는 자원 풀(연결, 허가, 속도 제한)을 조절합니다. 올바른 기본 요소(primitive)를 고르고 임계 구역을 짧게 유지하는 것이 정확하고 빠른 것과 정확하지만 느린 것의 차이를 만듭니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기