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
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.
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.
- 1. Powiadomienie o zmianach obiektu w blasku niebieskim
- 2. Powiadomienie znika po zakończeniu aktywności
- 3. Uzyskaj powiadomienie po zakończeniu przesyłania w Amazon S3 wiadro
- 4. Wyskakujące powiadomienie o telefonie iPhone
- 5. pole wyboru - powiadomienie o zmianie
- 6. Powiadomienie o nowych obiektach S3
- 7. Powiadomienie o Androidzie nie działa
- 8. SLCOmposeviewcontroller powiadomienie o współdzieleniu Twittera
- 9. Jak uzyskać powiadomienie o zamknięciu kanału SocketChannel?
- 10. Powiadomienie o Androidzie w konkretnym dniu
- 11. Powiadomienie Androida o wyłączeniu/włączeniu ekranu
- 12. Ustaw powiadomienie o konkretnej godzinie android
- 13. Powiadomienie o zamknięciu twitter-bootstrap nie działa
- 14. Powiadomienie o Androidzie Oczekujące dodatki null
- 15. Powiadomienie o statusbar w android phonegap
- 16. AVPlayer, powiadomienie o stanie odtwarzania/wstrzymania?
- 17. Jak zrobić powiadomienie o zmianie rozmiaru ekranu?
- 18. Powiadomienie o Androidzie nie jest uruchamiane (PendingIntent)
- 19. Powiadomienie o wielu liniach Corona sdk display
- 20. Powiadomienie o toastach w Windows 8.1 app
- 21. zawiadomić raz audio zakończeniu odtwarzania
- 22. Pytanie o konwersję obiektu JSON
- 23. Jak zatrzymać wszystkie zadania po zakończeniu C#
- 24. Cel C - otrzymasz powiadomienie, gdy metoda nazywa się
- 25. Jak otrzymać powiadomienie, gdy powiadomienie zostanie zgłoszone?
- 26. C# Reflection: Utwórz instancję obiektu o nazwie klasy String
- 27. Odtwarzanie kształtu przycisku o trójkątnym zakończeniu w CSS3
- 28. Powiadomienia w usłudze UIWebView o rozpoczęciu lub zakończeniu wyboru tekstu?
- 29. Sposób ostrzegania o zakończeniu ważności sesji (JWT) w React/Redux
- 30. C# - Tworzenie obiektu
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. –
+1 za używanie muteksu do powiadamiania –
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