2014-02-11 4 views
5

Auf der Windows-Plattform wird TCriticalSection durch Aufrufen der Windows-API EnterCriticalSection/LeaveCriticalSection implementiert. Die Microsoft-Dokumentation besagt explizit, dass nach dem Besitz eines Threads für einen kritischen Abschnitt zusätzliche Aufrufe von EnterCriticalSection vorgenommen werden können.Kann TCriticalSection.Acquire mehr als einmal von einem Thread sicher aufgerufen werden?

So weit so gut.

Aber was ist mit dem Verhalten unter den anderen Plattformen Delphi unterstützt wie OSX, iOS und Android?

Andere Plattformen scheint TMonitor zu verwenden. Also könnte die Frage gegen TMonitor neu geschrieben werden.

Antwort

4

Die Implementierung von TCriticalSection unter anderen Plattformen als Windows verwendet einfach TMonitor. Die Antwort auf Ihre Frage reduziert sich also auf das Verhalten von TMonitor.Enter. Zumindest die Dokumentation besagt, dass TMonitor.Enter reentrant ist.

Dieser Teil der documentation wäre ein „Ja“ Ihre Antwort bedeuten: den Zugriff aller anderen Threads aber den anruf eines mit dem angegebenen Objekt

Verbietet.

Der entsprechende Code Teil TMonitor ist in TMonitor.TryEnter:

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

Kann TMonitor in XE5 trauen? Ältere Delphi-Versionen zeigten Probleme mit TMonitor ... – whosrdaddy

+0

@Uwe Raabe Ich habe gesehen, dass TCriticalSection TMonitor verwendet, aber ich habe TMonitor in DocWiki/XE5 nicht gefunden. Ich habe meine Frage bearbeitet, um TMonitor hinzuzufügen. – fpiette

+0

@whosrdaddy Ich interessiere mich nicht für alte Delphi-Versionen. Ich benutze XE5. – fpiette

Verwandte Themen