Что такое мьютекс и какую проблему он решает в многопоточности

Ответ

Мьютекс (от англ. mutual exclusion — взаимное исключение) — это примитив синхронизации, который гарантирует эксклюзивный доступ к общему ресурсу для нескольких потоков. Он решает проблему состояния гонки (race condition), когда результат выполнения программы зависит от непредсказуемого порядка выполнения потоков.

Принцип работы:

  1. Поток, которому нужен доступ к ресурсу, пытается «захватить» мьютекс.
  2. Если мьютекс свободен, поток захватывает его, выполняет работу с ресурсом (входит в критическую секцию) и затем «освобождает» мьютекс.
  3. Если мьютекс уже захвачен другим потоком, текущий поток блокируется и ожидает его освобождения.

Пример на 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

Использование мьютекса обеспечивает атомарность операций в критической секции, делая код потокобезопасным.