Как называется участок кода, который необходимо защищать с помощью мьютекса?
Ответ от нейросети
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для таких задач.