Sobes.tech
Назад к вопросам
Junior — Middle
69

Как называется участок кода, который необходимо защищать с помощью мьютекса?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Это критическая секция, или критическая область. Это участок кода, где обращаются к общим данным или ресурсам, и его нужно выполнять атомарно относительно других потоков. Мьютекс нужен, чтобы в один момент времени туда попадал только один поток.

Определение:

Критическая секция — это часть программы, в которой поток читает, изменяет или использует общий ресурс, доступ к которому должен быть синхронизирован. Если несколько потоков зайдут туда одновременно без защиты, возможны гонки данных, потеря обновлений и некорректное состояние.

Пример использования:

Например, несколько потоков увеличивают общий счётчик. Без мьютекса два потока могут одновременно прочитать одно и то же значение и записать одинаковый результат, из-за чего одно увеличение потеряется.

import threading

counter = 0
lock = threading.Lock()

def inc():
    global counter
    with lock:  # критическая секция
        counter += 1

threads = [threading.Thread(target=inc) for _ in range(1000)]
for t in threads:
    t.start()
for t in threads:
    t.join()

print(counter)

Пояснение кода:

Код показывает общий счётчик counter, который изменяется из разных потоков. Строки внутри with lock: образуют критическую секцию: пока один поток выполняет counter += 1, другие ждут освобождения мьютекса. Это гарантирует, что операция инкремента не будет прервана и значение не потеряется.

Ключевые моменты:

  • Критическая секция — это код, работающий с общим изменяемым ресурсом.
  • Мьютекс защищает критическую секцию от одновременного входа нескольких потоков.
  • Без синхронизации возникают race condition и потеря данных.
  • Защищать нужно только минимально необходимый участок кода, чтобы не снижать параллелизм.
  • В Python часто используют threading.Lock для таких задач.