Frage

Ich möchte zwei Verfahren haben, die sich gegenseitig anrufen können, oder aus aufgerufen werden, was auch immer Threads laufen, aber nur einer nach dem anderen ausgeführt haben. Wie kann ich das machen? Wird diese Arbeit richtig?

var
  cs: TCriticalSection;

procedure a;
begin
  cs.Acquire;
  try
    // Execute single threaded here. 
  finally
    cs.Release;
  end;
end;

procedure b;
begin
  cs.Acquire;
  try
    // Execute single threaded here. Maybe with calls to procedure a.
  finally
    cs.Release;
  end;
end;
War es hilfreich?

Lösung

Ja, das wird funktionieren. Verfahren A kann rufen B und umgekehrt in dem gleichen Thread und während Thread A wird unter Verwendung von Verfahren A oder B, Thread B muss warten, wenn er will, diese Verfahren verwenden.

Sehen Sie die MSDN-Dokumentation über Kritische Abschnitte: http: //msdn.microsoft.com/en-us/library/ms682530%28VS.85%29.aspx

Kritische Abschnitte können verschachtelt werden, aber für jeden Anruf, den Sie erwerben müssen einen Anruf freigeben müssen. Da Sie Ihre Veröffentlichung Anruf in einem Versuch haben .. finally Sie sicherstellen, dass dies der Fall ist, so dass Ihr Code ist in Ordnung.

Andere Tipps

Während es möglich unter Windows ist ein kritischer Abschnitt mehrere Male zu erwerben, ist es nicht auf allen Plattformen möglich ist, werden einige von ihnen auf dem Versuch blockieren, um re-acquire ein Synchronisationsobjekt.

Es ist nicht wirklich ein Bedürfnis nach „Verschachtelung“ hier zu ermöglichen. Wenn Sie Ihre Klassen ordnungsgemäß gestalten, in einer Weise, dass die öffentliche Schnittstelle akquiriert und gibt den kritischen Abschnitt, und die Implementierungsmethoden nicht, und wenn Sie sicherstellen, dass nie Interface-Methoden Implementierung Methoden aufrufen, dann brauchen Sie nicht, dass insbesondere Funktion.

Siehe auch die Stack-Überlauf Frage "rekursive Sperre (Mutex) vs nichtrekursiven Sperre (Mutex) " für einige Details zu den schlechten Seiten des rekursiven Mutex / kritischen Abschnitt Erfassung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top