Почему на выходе нет 0, когда я использую threading.Lock для блокировки действий потока? - PullRequest
2 голосов
/ 28 мая 2020
import threading

COUNTER = 100000

lock = threading.Lock()

def add():
  global x
  with lock:
    for i in range(COUNTER):
      x += 1

def subtract():
  global x
  with lock:
    for i in range(COUNTER):
      x -= 1
x = 0
t0 = threading.Thread(target = add)
t1 = threading.Thread(target = subtract)
t0.start()
t1.start()
print(x)
# The output shall be zero isn't it?

Я создал этот код на основе кода, который видел в курсе, но он тоже не сработал. При совместном использовании переменной потоки работают неправильно с данными

1 Ответ

2 голосов
/ 28 мая 2020

Исправленный код:

import threading

COUNTER = 100000

lock = threading.Lock()


def add():
    global x
    with lock:
        for i in range(COUNTER):
            x += 1


def subtract():
    global x
    with lock:
        for i in range(COUNTER):
            x -= 1


x = 0
t0 = threading.Thread(target=add)
t1 = threading.Thread(target=subtract)
t0.start()
t1.start()
# Added the below lines
t0.join() 
t1.join()
# END
print(x)

Причина вашей ошибки в том, что ваш основной поток не ждет, пока ваши дочерние потоки завершат sh там процессы. Вот почему вы получаете необычный результат, когда печатаете значение x между ними.

...