Sobes.tech
Middle
70

Analysieren Sie den folgenden Python-Code, der threading verwendet, um eine Zählvariable zu erhöhen: ```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"Endgültiger Zählerwert: {counter}") ``` Erklären Sie, was die erwartete Ausgabe ist, und diskutieren Sie mögliche Probleme mit diesem Code bei der Verwendung von Threads.

Unternehmen wurden gefragt
СБЕРСБЕР

Antwort von AI

sobes.tech KI

Ожидаемый итог — значение счетчика около 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 в момент времени, и итог будет корректным.