Вот код:
Что в этом коде защищается критической секцией? И зачем?
aPipe? А ЗАЧЕМ? Если он подаётся СНАРУЖИ. И если уж его ЗАЩИЩАТЬ, то почему "тот кто его подаёт сверху" - НЕ ОЗАДАЧИЛСЯ защитой?
Или Now? А его-то ЗАЧЕМ?
Или что-то другое я не вижу?
Помогите пожалуйста.
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? А его-то ЗАЧЕМ?
Или что-то другое я не вижу?
Помогите пожалуйста.
Без контекста трудно понять... :-)
ОтветитьУдалитьВ частности непонятно, кому принадлежит критическая секция, где и как она ещё используется.
На первый взгляд похоже на формальный копипаст "фрейма" метода, где критическая секция действительно была востребована... Впрочем, если aPipe.WriteDateTime(Now) может изменять состояние экземпляра TSomeClass, использование критической сессии, вероятно, мотивировано.
А какой контекст нужен? :-)
Удалить"На первый взгляд похоже на формальный копипаст "фрейма" метода, где критическая секция действительно была востребована..."
-- вот и МНЕ так кажется :-) Завтра узнаю под отладчиком.
"Впрочем, если aPipe.WriteDateTime(Now) может изменять состояние экземпляра TSomeClass, использование критической сессии, вероятно, мотивировано."
-- НЕ МОЖЕТ.. НО замечание - ПРАВИЛЬНОЕ.
«А какой контекст нужен? :-)»
Удалить-- Описание других прецедентов использования этой критической секции.
Так можно было бы установить, что именно посредством её защищается.
Например, если критическая секция используется во всех методах TSomeClass, в которые передаётся один и тот же экземпляр TDataPipe, то ситуация будет проясняться, хотя вероятно, код архитектурно структурирован не самым удачным образом.
Такое иногда случается вследствие рефакторинга, проводимого разными людьми, разной квалификации и в разное время...
Не люблю домысливать чужой код, из которого увидел только пару строчек... ;-)
Правильные вопросы задаёте :-) Спасибо :-)
УдалитьЯ почему этот вопрос задал?
Не потому, что "я знаю ответ", а потому, что "сомневаюсь" в тех вещах "которые мне очевидны".
Я там дописал.
УдалитьОднозначно aPipe. Но имхо не в том месте. Правильней было бы чтобы критическая секция внутри aPipe.WriteDateTime упрятана была бы. Снаружи - как-то не место там озабачиваться синхронизацией. По любому секция должна быть в паре с aPipe - чтобы он гарантированно одним объектом защищался.
ОтветитьУдалитьА так - да, контекста не хватает, но тут защите не место.. имхо.
aPipe на самом деле подаётся сверху, где и создаётся.Ты скоро это увидишь :-)
УдалитьНо в остальном ты прав - "место не то",если уж защищать aPipe, То либо в НЁМ САМОМ, либо в ТОМ, что этот aPipe ПОДАЁТ СВЕРХУ. Так?