Выбор ответа Middle GIL, потоки и процессы спрашивают часто обновлено

Гонка данных при наличии GIL

Вопрос

Четыре потока по 1 000 000 раз выполняют counter += 1 для общей глобальной переменной без блокировки. Что гарантирует CPython с GIL?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ничего: результат может быть меньше 4 000 000. counter += 1 это чтение, сложение и запись, несколько байткод-инструкций.

Варианты ответа

  1. Ровно 4 000 000: GIL делает += атомарной операцией
  2. Ничего: результат может быть меньше 4 000 000правильный ответ
  3. Программа упадёт с RuntimeError о гонке
  4. Результат всегда ровно 1 000 000 из-за GIL

Разбор

counter += 1 это чтение, сложение и запись, несколько байткод-инструкций. Интерпретатор может переключить поток между ними, и два потока запишут одно и то же значение. На конкретной версии CPython потеря может проявляться редко, но гарантий нет, а во free-threaded сборке она почти неизбежна. Решение: with lock: или отказ от общего состояния. Ошибки интерпретатор не бросает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.