Middle
46
Analyseer de volgende Python-code die threading gebruikt om een tellervariabele te verhogen: ```python import threading import time counter = 0 def increment(): global counter for _ in range(100000): current = counter counter = current + 1 thread1 = threading.Thread(target=increment) thread2 = threading.Thread(target=increment) thread1.start() thread2.start() thread1.join() thread2.join() print(f"Eindwaarde van de teller: {counter}") ``` Leg uit wat de verwachte output is en bespreek eventuele potentiële problemen met deze code bij het gebruik van threads.
Bedrijven waar gevraagd werd
Antwoord van AI
sobes.tech AI
Ожидаемый итог — значение счетчика около 200000, так как два потока по 100000 инкрементов каждый.
Однако из-за отсутствия синхронизации между потоками происходит гонка данных (race condition). Операция counter = current + 1 не атомарна: поток читает значение, увеличивает и записывает обратно. Если оба потока прочитают одно и то же значение одновременно, один из инкрементов потеряется.
В итоге итоговое значение счетчика будет меньше 200000 и варьироваться при разных запусках.
Чтобы исправить, нужно использовать блокировку (например, threading.Lock) для защиты критической секции:
import threading
counter = 0
lock = threading.Lock()
def increment():
global counter
for _ in range(100000):
with lock:
counter += 1
Это гарантирует, что только один поток изменяет counter в момент времени, и итог будет корректным.