Sobes.tech
Назад к вопросам
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, так как операции инкремента защищены от одновременного доступа.