Sobes.tech
Middle
36

import threading import time čítač = 0 def zvýšení(): global čítač for _ in range(100): aktuální = čítač time.sleep(0.000001) čítač = aktuální + 1 thread1 = threading.Thread(target=zvýšení) thread2 = threading.Thread(target=zvýšení) thread1.start() thread2.start() thread1.join() thread2.join() print(f"Konečná hodnota čítače: {čítač}") 150-200

Společnosti byly požádány
СБЕРСБЕР

Odpověď od AI

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