@Eugene-123

Почему подсчет ссылок НЕ является потокобезопасным?

Я тут прочел, что python использует GIL, и одной из причин является тот факт, что ссылки на каждый объект подсчитываются и это не потокобезопасно. Почему подсчет ссылок не безопасен? Так же я прочел, что:
Проблема, которую решает GIL, связана с тем, что в многопоточном приложении сразу несколько потоков могут увеличивать или уменьшать значения этого счётчика ссылок. Это может привести к тому, что память очистится неправильно и удалится тот объект, на который ещё существует ссылка.
Как это может произойти? Правильно ли я понимаю, что если два потока случайно выполняют что-то типа counter++ одновременно, то счетчик увеличивается не на 2, а на 1?
И еще:
Но добавление блокировки к нескольким объектам может привести к появлению другой проблемы — взаимоблокировки (англ. deadlocks), которая получается только если блокировка есть более чем на одном объекте. К тому же эта проблема тоже снижала бы производительность из-за многократной установки блокираторов.

Объясните в чем тут суть? И в чем снижение производительности? В том что вы просто установили какой-то там флаг?
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
@bacon
Задача увеличить значения X на 1. Допустим есть два потока, каждый совершает по два действия: получить значение и увеличить его на 1.

Вариант 1:
Первый поток получает это значение, оно равно 0
Первый поток увеличивает это значение (0), оно равно 1
Второй поток получает это значение, оно равно 1
Второй поток увеличивает это значение (1), оно равно 2

Вариант 2:
Первый поток получает это значение, оно равно 0
Второй поток получает это значение, оно равно 0
Первый поток увеличивает это значение (0), оно равно 1
Второй поток увеличивает это значение (0), оно равно 1
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
07 мар. 2021, в 03:18
1500 руб./за проект
06 мар. 2021, в 22:58
70000 руб./за проект
06 мар. 2021, в 22:36
10000 руб./за проект