Предотвращение тупиков - PullRequest
2 голосов
/ 09 августа 2011

для псевдо-функции, такой как

void transaction(Account from, Account to, double amount){
      Semaphore lock1, lock2;
      lock1 = getLock(from);
      lock2 = getLock(to)

      wait(lock1);
         wait(lock2);

            withdraw(from, amount);
            deposit(to, amount);

         signal(lock2);
      signal(lock1);
}

тупик возникает при выполнении транзакции (A, B, 50) транзакции (B, A, 10)

как это можно предотвратить?

будет ли это работать?

Ответы [ 2 ]

5 голосов
/ 09 августа 2011

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

Другая стратегия предотвращения взаимоблокировок заключается в уменьшении количества блокировок. В этом случае может быть лучше иметь блокировку one , которая блокирует все учетные записи. Это определенно сделало бы структуру замка намного более простой. Если приложение показывает проблемы с производительностью при большой нагрузке, а профилирование показывает, что проблема заключается в перегрузке блокировок - тогда пришло время придумать более детальную стратегию блокировки.

2 голосов
/ 09 августа 2011

Сделав всю транзакцию критическим разделом? Это только одно возможное решение, по крайней мере.

У меня такое ощущение, что это какая-то домашняя работа, потому что она очень похожа на проблему столовых философов , основанную на приведенном вами примере кода. (Множество решений проблемы доступно по предоставленной ссылке, просто чтобы вы знали. Проверьте их, если вы хотите лучше понять концепции.)

...