mutexは相互排他(mutual exclusion)を保証するロックです。一度に1つのスレッドだけが保持でき、保護されたcritical sectionに入れます。 semaphoreはこれを一般化し、最大N個の同時保持を許します。
mutexは相互排他(mutual exclusion)を保証するロックです。一度に1つのスレッドだけが保持でき、保護されたcritical sectionに入れます。 semaphoreはこれを一般化し、最大N個の同時保持を許します。
acquire()は減算し(0でブロック)、release()は加算する。mutexは本質的にN=1のsemaphoreだが、所有権のセマンティクスを持つ。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を使い、例外時でも解放が自動になるようにする。これらは共有状態を守るための日常的な道具です。mutexはアクセスを直列化してraceを防ぎ、semaphoreはリソースプール(接続、許可、レート制限)を絞ります。正しいプリミティブを選び、critical sectionを短く保つことが、「正しくて速い」と「正しいが遅い」の分かれ目です。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する