Ответ
Мьютекс (от англ. mutual exclusion — взаимное исключение) — это примитив синхронизации, который гарантирует эксклюзивный доступ к общему ресурсу для нескольких потоков. Он решает проблему состояния гонки (race condition), когда результат выполнения программы зависит от непредсказуемого порядка выполнения потоков.
Принцип работы:
- Поток, которому нужен доступ к ресурсу, пытается «захватить» мьютекс.
- Если мьютекс свободен, поток захватывает его, выполняет работу с ресурсом (входит в критическую секцию) и затем «освобождает» мьютекс.
- Если мьютекс уже захвачен другим потоком, текущий поток блокируется и ожидает его освобождения.
Пример на Python с threading.Lock
:
import threading
# Общий ресурс
counter = 0
# Мьютекс для защиты ресурса
lock = threading.Lock()
def increment():
global counter
for _ in range(100000):
# with автоматически захватывает и освобождает мьютекс
with lock:
counter += 1
threads = [threading.Thread(target=increment) for _ in range(10)]
for t in threads:
t.start()
for t in threads:
t.join()
# Без мьютекса результат был бы непредсказуем
print(f"Итоговое значение: {counter}") # Гарантированно 1000000
Использование мьютекса обеспечивает атомарность операций в критической секции, делая код потокобезопасным.