2014-02-11 2 views
5

На платформе Windows TCriticalSection реализуется путем вызова API Windows EnterCriticalSection/LeaveCriticalSection. Документация Microsoft прямо говорит, что после того, как поток имеет право собственности на критический раздел, он может совершать дополнительные вызовы для EnterCriticalSection.Может ли TCriticalSection.Acquire безопасно звонить более одного раза по потоку?

Пока все хорошо.

Но как насчет поведения других платформ, поддерживаемых Delphi, таких как OSX, iOS и Android?

Другие платформы, похоже, используют TMonitor. Поэтому вопрос может быть переписан с TMonitor.

ответ

4

Реализация TCriticalSection под другими платформами, чем Windows, просто использует TMonitor. Таким образом, ответ на ваш вопрос сводится к поведению TMonitor.Enter. По крайней мере, в документации указано, что TMonitor.Enter является реентерабельным.

Эта часть documentation будет означать «да» на ваш ответ:

Запрещает доступ всех других потоков, но вызывающие один к указанному объекту.

Соответствующий код часть TMonitor в TMonitor.TryEnter:

function TMonitor.TryEnter: Boolean; 
begin 
    if FOwningThread = GetCurrentThreadId then // check for recursion 
    begin 
    ... 
    Result := True; 
    ... 
+0

Может TMonitor доверять в xe5? Предыдущие версии Delphi выявили проблемы с TMonitor ... – whosrdaddy

+0

@Uwe Raabe Я видел, что TCriticalSection использует TMonitor, но я не нашел TMonitor, зарегистрированного в DocWiki/XE5. Я редактировал свой вопрос, чтобы добавить в него TMonitor. – fpiette

+0

@whosrdaddy Мне не нужны старые версии Delphi. Я использую XE5. – fpiette

Смежные вопросы