Тупиковые ситуации Delphi, объяснение / решение

В серверном приложении у нас есть следующее: Класс, называемый JobManager, является одноэлементным. Другой класс, Scheduler, постоянно проверяет, не пора ли добавить какое-либо задание в JobManager.

Когда приходит время сделать это, Scheduler выполняет что-то вроде:

TJobManager.Singleton.NewJobItem(parameterlist goes here...);

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

NewJobItem(parameter list...);

В методе NewJobItem у меня есть что-то вроде этого:

  CS.Acquire;
  try
    DoSomething;
    CallAMethodWithAnotherCriticalSessionInternally;
  finally
    CS.Release;
  end;

Бывает, что система достигает тупик на этом этапе (CS.Acquire). Связь между клиентским и серверным приложением осуществляется через Indy 10. Я думаю, что вызов RPC, который запускает метод серверного приложения, который отправляет сообщение в JobManager, выполняется в контексте Indy Thread.

Планировщик имеет свой собственный поток, и он выполняет прямой вызов метода JobManager . Склонна ли эта ситуация к тупикам? Может ли кто-нибудь помочь мне понять, почему здесь происходит взаимоблокировка?

Мы знали, что иногда, когда клиент выполнял определенное действие, которое приводило к блокировке системы, я мог, наконец, выяснить этот момент, где находится критический раздел один и тот же класс достигается дважды, из разных точек (планировщик и метод обработчика сообщений JobManager).

Дополнительная информация

Я хочу добавить это (это может быть глупо, но в любом случае ...) внутри DoSomething есть другой

  CS.Acquire;
  try
    Do other stuff...
  finally
    CS.Release; 
  end;

Этот внутренний CS.Release что-нибудь делает с внешним CS.Acquire? Если это так, то это может быть момент, когда планировщик входит в критическую секцию, и все блокировки и разблокировки превращаются в беспорядок.

6
задан ronaldosantana 11 May 2011 в 21:08
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: