Назад к вопросам
СБЕР
Middle
1
import threading import time counter = 0 def increment(): global counter for _ in range(100): current = counter time.sleep(0.000001) counter = current + 1 thread1 = threading.Thread(target=increment) thread2 = threading.Thread(target=increment) thread1.start() thread2.start() thread1.join() thread2.join() print(f"Итоговое значение счетчика: {counter}") 150-200
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
В представленном коде происходит гонка данных из-за отсутствия синхронизации при изменении глобальной переменной counter. Два потока одновременно читают и записывают значение, что приводит к потере инкрементов.
Из-за этого итоговое значение счетчика будет меньше ожидаемых 200 (2 потока × 100 инкрементов).
Чтобы исправить проблему, нужно использовать блокировку (lock), которая гарантирует, что только один поток изменяет counter в момент времени:
import threading
import time
counter = 0
lock = threading.Lock()
def increment():
global counter
for _ in range(100):
with lock:
current = counter
time.sleep(0.000001)
counter = current + 1
thread1 = threading.Thread(target=increment)
thread2 = threading.Thread(target=increment)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print(f"Итоговое значение счетчика: {counter}")
Теперь counter будет равен 200, так как операции инкремента защищены от одновременного доступа.