Мьютекс — это блокировка, которая гарантирует взаимное исключение: только один поток может удерживать её и войти в защищённую критическую секцию в один момент. Семафор обобщает это, позволяя до N одновременных держателей.
Мьютекс — это блокировка, которая гарантирует взаимное исключение: только один поток может удерживать её и войти в защищённую критическую секцию в один момент. Семафор обобщает это, позволяя до N одновременных держателей.
acquire() уменьшает (блокируется на 0), release() увеличивает. Мьютекс по сути — это семафор с N=1, но с семантикой владения.lock = threading.Lock()
def transfer(a, b, amt):
with lock: # критическая секция — один поток за раз
a.balance -= amt
b.balance += amt
# Семафор: ограничить одновременные соединения с БД до 10
sem = threading.Semaphore(10)
def query():
with sem: # до 10 потоков выполняют это одновременно
db.execute(...)
with/RAII/defer, чтобы освобождение было автоматическим даже при исключениях.Это повседневные инструменты для защиты общего состояния. Мьютексы сериализуют доступ, чтобы предотвратить гонки; семафоры ограничивают пул ресурсов (соединения, разрешения, лимиты частоты). Выбор правильного примитива и сохранение критических секций короткими — это разница между корректно-и-быстро и корректно-но-медленно.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать