Серверный JavaScript 1.4. Руководство по использованию




Исключение Мёртвой Блокировки/Deadlock - часть 3


if ( project.ordersLock.lock() ) {

   var c = project.orders.count;
   c = c + 1;

   project.orders.count = c;

   project.ordersLock.unlock();
}

Второй фрагмент будет примерно таким:

// Стартовать новый заказ.


if ( project.ordersLock.lock() ) {

   var c = project.orders.count;

   c = c + 1;
   project.orders.count = c;

   project.ordersLock.unlock();
}

if (...код для определения неизвестного потребителя...) {

   // Создать нового потребителя.

   if ( project.customersLock.lock() ) {

      var id = project.customers.ID;

      id = id + 1;

      project.customers.ID = id;

      project.customersLock.unlock();

   }
}

Хотя это и надуманная ситуация, тупики это совершенно реальная проблема, и они могут произойти во многих случаях. Для этого даже не понадобится более одного замка или более одного запроса. Рассмотрим код, в котором две функции запрашивают один и тот же замок:

function fn1 () {
   if ( project.lock() ) {

      // ... какие-то действия ...

      project.unlock();
   }
}

function fn2 () {
   if ( project.lock() ) {

      // ... какие-то другие действия ...

      project.unlock();
   }
}

Сам по себе этот код не содержит проблем. Позднее слегка измените его, чтобы fn1 вызывала fn2, уже имея замок, как показано далее:

function fn1 () {
   if ( project.lock() ) {

      // ... какие-то действия ...

      fn2();
      project.unlock();

   }
}

Вот вы и получили тупик/deadlock. Это, конечно, немного смешно, когда единственный запрос ожидает от самого себя освобождения флага!




Содержание  Назад  Вперед