Middle
import threading import time čítač = 0 def zvýšenie(): global čítač for _ in range(100): aktuálny = čítač time.sleep(0.000001) čítač = aktuálny + 1 thread1 = threading.Thread(target=zvýšenie) thread2 = threading.Thread(target=zvýšenie) thread1.start() thread2.start() thread1.join() thread2.join() print(f"Konečná hodnota čítača: {čítač}") 150-200
sobes.tech AI
Odpoveď od 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, так как операции инкремента защищены от одновременного доступа.