2010-07-27 13 views
6

W programie C++ mam dwa obiekty zliczane z odwołaniem: Król i Spadkobierca. Dziedzic musi zablokować, dopóki Król nie zostanie zniszczony. King jest obiektem liczonym jako odniesienie, które zostanie zniszczone, gdy licznik odniesie się do zera. Jeśli Heir posiada odniesienie do króla, liczba referencyjna króla nigdy nie osiągnie wartości zero. Jak można powstrzymać dziedzica, dopóki król nie zostanie zniszczony?Powiadomienie o zakończeniu obiektu C++

Odpowiedz

10

Można użyć odniesienia nie będącego właścicielem (lub "słabego"), podobnego do how weak_ptr works.

Co do czekania, aż król umrze, możesz użyć muteksu, który król może przytrzymać, dopóki nie umrze i nie będzie miał bloku dziedzica czekającego na uwolnienie króla.

Jeśli musisz mieć wielu spadkobierców oczekujących i jest jakiś rozkaz dla spadkobierców, możesz mieć obiekt "selekcjonera następcy", który śledzi listę spadkobierców i ich kolejność pierwszeństwa, a kiedy król wypuszcza mutex przypisuje własność tego muteksu następnemu spadkobiercy na liście.

+0

Bah .. odpowiedzieliśmy na to samo i dodaliśmy trochę więcej w części czekania. Usunięto kopalnię i podniosłem twoją. Aby dodać, spadkobierca powinien przechowywać referencję weak_ptr do króla. –

+0

+1 za używanie muteksu do powiadamiania –

+0

Plik weak_ptr nie będzie działał - przynajmniej nie bez odpytywania. Aby wykonać metodę blokowania w King, musisz odwołać się do słabego-ptr. Gdy tak się stanie, otrzymasz silne odniesienie do obiektu i przytrzymaj go, dopóki nie znajdzie się w zasięgu. – brianegge

0

Dzięki @James. Oto rozwiązanie, które zakończyłem:

Metoda mutex wydawała się obiecująca, ale większość muteksów oczekuje, że wątek nabywający i zwalniający wątek będą takie same. W końcu, miałem Heir'a, stworzyłem semafor z liczbą zera na stosie, przekazałem wskaźnik do semafora królowi, uwolniłem króla, a następnie próbowałem zdobyć semafor. Liczba jest zerowa, więc Heir natychmiast blokuje. Gdy jest wywoływany destruktor Kinga, wywołuje on "release" na semaforze. Wydaje się, że działa poprawnie z semaforem Faleza fali.

Powiązane problemy