2010-07-27 5 views
6

In einem C++ - Programm habe ich zwei Referenzobjekte gezählt: King und Heir. Erbe muss blockieren, bis König zerstört wird. King ist ein Referenz-Zählobjekt, das zerstört wird, wenn der Referenzzähler auf Null geht. Wenn der Erbe einen Bezug zu König hat, wird der Referenzzähler von König niemals auf Null gehen. Wie kann Heir blockieren, bis König zerstört ist?C++ Objekt Kündigung Benachrichtigung

Antwort

10

Sie können eine nicht besitzende (oder "schwache") Referenz verwenden, ähnlich wie how weak_ptr works.

Um zu warten, bis der König tot ist, können Sie einen Mutex verwenden, den der König halten kann, bis er stirbt und den Erbblock darauf wartet, dass der König ihn freigibt.

Wenn Sie mehrere Erben warten müssen und einige Erben bestellen, können Sie ein "Erben - Selektor" -Objekt haben, das die Liste der Erben und ihre Rangfolge verfolgt, und wenn der König die Mutex wird dem nächsten Erben in der Liste den Besitz dieses Mutex zuweisen.

+0

Bah .. wir antworteten die gleiche Sache und Sie fügten ein wenig mehr auf den wartenden Teil hinzu. Gelöscht meins und hochgehoben. Nur um hinzuzufügen, sollte der Erbe die schwache_ptr-Referenz auf den König halten. –

+0

+1 für die Verwendung eines Mutex für die Benachrichtigung –

+0

Der weak_ptr wird nicht funktionieren - zumindest nicht ohne Polling. Um eine Blockierungsmethode für King auszuführen, müssen Sie die Schwachstelle zurücksetzen. In diesem Fall erhalten Sie einen starken Verweis auf das Objekt und halten es so lange, bis es sich im Bereich befindet. – brianegge

0

Dank @James. Hier ist die Lösung, mit der ich endete:

Die Mutex-Methode schien vielversprechend, aber die meisten Mutexe erwarten, dass der Acquiring-Thread und der Release-Thread identisch sind. Am Ende hatte ich Heir einen Semaphor mit einer Zählung von Null auf dem Stapel erstellen lassen, einen Zeiger auf den Semaphor an König übergeben, King loslassen und dann versuchen, den Semaphor zu erhalten. Die Zählung ist Null, also blockiert Heir sofort. Wenn der Destruktor des Königs aufgerufen wird, ruft er die Freigabe auf dem Semaphor auf. Dies scheint mit dem Rogue Wave Semaphor in Ordnung zu sein.

Verwandte Themen