+- похожий пример того, что бывает если использовать не атомарные операции
counter = 0
def f():
global counter
for i in range(1000):
counter += 1
Если запустить этот код в нескольких потоках, то результат count должен быть на каждом запуске программы разным. Почему так, я понимаю. Операция += не атомарная и происходит в три этап: взятие значения, увелечения на 1, изменения переменной. Понимаю, что в процессе этих операций другой поток может влезть и тоже начать ее изменять, соотвественно тут и должны появиться ошибки в вычислениях. Но сколько бы я раз не запускал этот код в разных потоках ответ всегда нормальный: Запускаю в 4 потока - ответ 4000, запускаю в 5 - ответ 5000 и так далее. Менял интервал переключения GIL на 0.000001 и тоже не дало эффекта. Запускаю таким кодом
counter = 0
def f():
global counter
for i in range(1000):
counter += 1
for i in range(30):
t = threading.Thread(target=f)
t.start()
main_thread = threading.main_thread()
for t in threading.enumerate():
if t is not main_thread:
t.join()
в чем рофл, ребята?
у тебя цель нарваться на race condition?)
сделай интервал еще меньше видимо += слишком быстро у тебя работает
Интервал переключения GIL?
a += 1 емнип в CPython атомарная, a вот a = a + 1 нет
Обсуждают сегодня