среда, 18 июня 2014 г.

Вопрос к читающим и думающим

Вот код:

procedure TSomeClass.DoReply(aPipe: TDataPipe);
begin
 Self.CriticalSection.Enter;
 try
  aPipe.WriteDateTime(Now);
 finally
  Self.CriticalSection.Leave;
 end;//try..finally
end;TSomeClass.DoReply

Что в этом коде защищается критической секцией? И зачем?

aPipe? А ЗАЧЕМ? Если он подаётся СНАРУЖИ. И если уж его ЗАЩИЩАТЬ, то почему "тот кто его подаёт сверху" - НЕ ОЗАДАЧИЛСЯ защитой?

Или Now? А его-то ЗАЧЕМ?

Или что-то другое я не вижу?

Помогите пожалуйста.

7 комментариев:

  1. Без контекста трудно понять... :-)
    В частности непонятно, кому принадлежит критическая секция, где и как она ещё используется.
    На первый взгляд похоже на формальный копипаст "фрейма" метода, где критическая секция действительно была востребована... Впрочем, если aPipe.WriteDateTime(Now) может изменять состояние экземпляра TSomeClass, использование критической сессии, вероятно, мотивировано.

    ОтветитьУдалить
    Ответы
    1. А какой контекст нужен? :-)

      "На первый взгляд похоже на формальный копипаст "фрейма" метода, где критическая секция действительно была востребована..."

      -- вот и МНЕ так кажется :-) Завтра узнаю под отладчиком.

      "Впрочем, если aPipe.WriteDateTime(Now) может изменять состояние экземпляра TSomeClass, использование критической сессии, вероятно, мотивировано."

      -- НЕ МОЖЕТ.. НО замечание - ПРАВИЛЬНОЕ.

      Удалить
    2. «А какой контекст нужен? :-)»
      -- Описание других прецедентов использования этой критической секции.
      Так можно было бы установить, что именно посредством её защищается.
      Например, если критическая секция используется во всех методах TSomeClass, в которые передаётся один и тот же экземпляр TDataPipe, то ситуация будет проясняться, хотя вероятно, код архитектурно структурирован не самым удачным образом.
      Такое иногда случается вследствие рефакторинга, проводимого разными людьми, разной квалификации и в разное время...
      Не люблю домысливать чужой код, из которого увидел только пару строчек... ;-)

      Удалить
    3. Правильные вопросы задаёте :-) Спасибо :-)

      Я почему этот вопрос задал?

      Не потому, что "я знаю ответ", а потому, что "сомневаюсь" в тех вещах "которые мне очевидны".

      Удалить
  2. Однозначно aPipe. Но имхо не в том месте. Правильней было бы чтобы критическая секция внутри aPipe.WriteDateTime упрятана была бы. Снаружи - как-то не место там озабачиваться синхронизацией. По любому секция должна быть в паре с aPipe - чтобы он гарантированно одним объектом защищался.
    А так - да, контекста не хватает, но тут защите не место.. имхо.

    ОтветитьУдалить
    Ответы
    1. aPipe на самом деле подаётся сверху, где и создаётся.Ты скоро это увидишь :-)

      Но в остальном ты прав - "место не то",если уж защищать aPipe, То либо в НЁМ САМОМ, либо в ТОМ, что этот aPipe ПОДАЁТ СВЕРХУ. Так?

      Удалить