Python - Если блокировка получена в потоке, все переменные в этом потоке заблокированы? - PullRequest
0 голосов
/ 30 января 2020
import threading

v = 0
lock = threading.Lock()

def increment():
  global v
  v += 1
  lock.acquire()

def decrement():
  global v
  v -= 1

thread1 = threading.Thread(target = increment)
thread2 = threading.Thread(target = decrement)
thread1.start()
thread2.start()
print(v)

Этот код печатает 0 , thread2 работает нормально. Thread1 явно получил блокировку, почему thread2 также может манипулировать глобальной переменной v?

1 Ответ

0 голосов
/ 30 января 2020

Получение блокировки не мешает кому-либо получить доступ к чему-либо. Это просто контракт, который критические части кода могут проверить, разрешено ли им доступ к объекту. Это должно быть реализовано в вашем коде. Простой пример:

# Thread 1
lock.acquire() # blocks if someone else locked first
# access "protected" object here
lock.release() # give someone else the opportunity to lock


#Thread 2
lock.acquire() # blocks if someone else locked first
# access "protected" object here
lock.release() # give someone else the opportunity to lock

Итак, для вашего примера и с помощью контекстного менеджера для автоматической блокировки и снятия блокировки вы получите что-то вроде:

import threading

v = 0
lock = threading.Lock()

def increment():
    global v
    with lock:
        v += 1

def decrement():
    global v
    with lock:
        v -= 1

...
...