Вопрос тупика 19.5 в элементах программирования интервью - PullRequest
0 голосов
/ 08 сентября 2018

В этом вопросе из элементов собеседований по программированию утверждается, что в следующем коде существует тупик в сценарии, в котором «U1 инициирует передачу в U2, а сразу после этого U2 инициирует передачу в U1. Поскольку каждая передача происходит в отдельном потоке, первый поток может заблокировать U1, а второй - U2 "

class Account:
    _global_id = 0

    def __init__(self, balance):
        self._balance = balance
        self._id = Account._global_id
        Account._global_id += 1
        self._lock = threading.RLock()

    def get_balance(self):
        return self._balance

    @staticmethod
    def transfer(acc_from, acc_to, amount):
        th = threading.Thread(target=acc_from._move, args=(acc_to, amount))
        th.start()

    def _move(self, acc_to, amount):
        with self._lock:
            if amount > self._balance:
                return False
            acc_to._balance += amount
            self._balance -= amount
            print('returning True')
            return True

Я не вижу, как в этом случае возникает тупик. U1 и U2 имеют отдельные блокировки, и, насколько я могу судить, thread1 просто блокирует U1, а thread2 блокирует U2, поскольку метод _move просто использует self._lock и не затрагивает acc_to._lock. Чего мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...