Warsztat » Forum

[C++] Samo-NULLujące smart pointery

Nov 18, 2009 | Liosan |
45 wypowiedzi na 3 stronach:
1 2 3
yarpen
Nov 18, 2009

Odp: Samo-NULLujące smart pointery

Jedno slowo: ID. Najprostsza forma slabej referencji.
JCoder
Feb 5, 2010

Odp: Samo-NULLujące smart pointery

Cytat:

Tak, czy inaczej, jeżeli kilka wątków ma się grzebać w tych samych danych, to najczęściej tylko świadczy o kiepskim podziale zadań między wątki.


Chciałbym zauważyć, że problem masz nie jak kilka wątków GRZEBIE we wspólnych danych, tylko wystarczy, że CZYTAJĄ wspólne dane. A czytanie wspólnych danych przez wiele wątków to już dosyć częsta praktyka. 

IMHO pomysł yarpena jest najlepszy: ID. Po co kombinować?
Regedit
Feb 13, 2010

Odp: Samo-NULLujące smart pointery

Hej, ale przecież gdyby to obiekt podczas zwalniania jakoś zerował wszystkie wskazujące na niego inteligentne wskaźniki, to narzut byłby tylko podczas usuwania obiektu. A tak, posługując się identyfikatorami, trzeba je za każdym razem rozwiązywać do normalnych wskaźników przez jakieś tablice haszujące czy inne struktury danych, co przecież nie jest darmowe.
Dab
Feb 15, 2010

Odp: Samo-NULLujące smart pointery

No właśnie, ja nie do końca obczajam tę ideę ultimate ID. Jak rozpoznam że przykładowo tekstura której mam ID nie została skasowana?
Krzysiek K.
Feb 16, 2010

Odp: Samo-NULLujące smart pointery

Cytat:
Chciałbym zauważyć, że problem masz nie jak kilka wątków GRZEBIE we wspólnych danych, tylko wystarczy, że CZYTAJĄ wspólne dane. A czytanie wspólnych danych przez wiele wątków to już dosyć częsta praktyka.

Najczęstszą praktyką jest też to, że jeżeli wątki czytają wspólne dane, to żaden inny wątek już w tych danych grzebać nie ma prawa. ;)
yarpen
Feb 17, 2010

Odp: Samo-NULLujące smart pointery

Cytat:

No właśnie, ja nie do końca obczajam tę ideę ultimate ID. Jak rozpoznam że przykładowo tekstura której mam ID nie została skasowana?

Bedziesz mial zerowy wskaznik powiazany z tym ID/ew. uchwyt bedzie mial inna 'liczbe kontrolna'.
JCoder
Feb 18, 2010

Odp: Samo-NULLujące smart pointery

Cytat:

Najczęstszą praktyką jest też to, że jeżeli wątki czytają wspólne dane, to żaden inny wątek już w tych danych grzebać nie ma prawa.


Ale jeśli potrzebujesz do czegoś samonullujących się wskaźników, to zakładasz, że "coś innego" może nagle te dane usunąć i Ty w swoim module chcesz o tym wiedzieć (albo przez nieznalezienie ID, albo przez wyzerowany wskaźnik). Więc jakaś forma synchronizacji musi występować.

IMHO sytuacja, że coś z zewnątrz grzebie niejawnie w innych danych i np. je usuwa zerując mi jakieś wskaźniki, jest proszeniem się o problemy - a dokładniej wprowadzaniem niejawnych powiązań między modułami i łamaniem abstrakcji. Czemu nie możesz wysłać informacji do wszystkich zainteresowanych modułów, że właśnie zwalniasz jakiś obiekt i żeby sobie wyzerowały do niego wskaźniki? Nie wierzę, że robisz to tak często, żeby stanowiło to jakiś istotny narzut. Debugowanie sekwencyjnego kodu jest znacznie łatwiejsze.
Krzysiek K.
Feb 19, 2010

Odp: Samo-NULLujące smart pointery

Cytat:
Ale jeśli potrzebujesz do czegoś samonullujących się wskaźników, to zakładasz, że "coś innego" może nagle te dane usunąć i Ty w swoim module chcesz o tym wiedzieć (albo przez nieznalezienie ID, albo przez wyzerowany wskaźnik). Więc jakaś forma synchronizacji musi występować.

Jeśli używam samonullujących sie wskaźników, to zakładam, że z tego typu obiektów korzysta wyłącznie jeden określony wątek.

Cytat:
Czemu nie możesz wysłać informacji do wszystkich zainteresowanych modułów, że właśnie zwalniasz jakiś obiekt i żeby sobie wyzerowały do niego wskaźniki?

Bo to by wymagało gigantycznej implementacji po stronie każdego z modułów (przejście po wszystkich obiektach i odszukanie wszystkich wskaźników tego typu).

Cytat:
Nie wierzę, że robisz to tak często, żeby stanowiło to jakiś istotny narzut.

Właśnie będzie stanowiło istotny narzut: nie mam czasu pisać takich rzeczy i wolę napisać samonullujące się wskaźniki. A że przez to w obrębie danego modułu nie będę mógł używać wątków - who cares. :)
JCoder
Feb 19, 2010

Odp: Samo-NULLujące smart pointery

Cytat:

nie mam czasu pisać takich rzeczy i wolę napisać samonullujące się wskaźniki.


Widać więc, że masz czas na debugowanie nieoczekiwanych segfaultów spowodowanych dereferencją takiego automatycznie znullowanego wskaźnika... Dobra, o gustach się nie dyskutuje :)

Cytat:

Bo to by wymagało gigantycznej implementacji po stronie każdego z modułów (przejście po wszystkich obiektach i odszukanie wszystkich wskaźników tego typu).


Jeżeli do wykonania czegoś, co można zapisać jednym zdaniem w języku naturalnym, musisz używać gigantycznej ilości kodu, to IMHO coś nie tak z designem. W porównaniu z gigantyczną (i rozsianą po różnych miejscach kodu) implementacją dotyczącą sprawdzania każdego wskaźnika na nie-nullowość przed użyciem, to przejechanie po wszystkich wskaźnikach w jednym miejscu kodu to powinien być pikuś.

// Dopisane: dobra, widzę już sens tego rozwiązania. Trzeba było pisać od razu, że chodzi o obronę przed pozostawieniem i użyciem jakiegoś zabłąkanego wskaźnika i zamianę niedeterministycznego segfaulta na deterministyczny w tej sytuacji (dereferencja nulla). Ale to dziwne, bo podobno programiści C++ nie robią takich błędów...
Dab
Feb 20, 2010

Odp: Samo-NULLujące smart pointery

Cytat:

Bedziesz mial zerowy wskaznik powiazany z tym ID/ew. uchwyt bedzie mial inna 'liczbe kontrolna'.


Aha, czyli w zasadzie równie dobrze można użytkownikom obiektu dawać wskaźnik na jakiś wskaźnik pośredni i wyjdzie na to samo.
Krzysiek K.
Feb 19, 2010

Odp: Samo-NULLujące smart pointery

Cytat:
Widać więc, że masz czas na debugowanie nieoczekiwanych segfaultów spowodowanych dereferencją takiego automatycznie znullowanego wskaźnika...

Przy pierwszym użyciu w danej funkcji sprawdzasz, czy jest NULL (standardowa praktyka). Dalej, już masz gwarancję, że wszystko jest OK, bo przecież z zewnątrz nikt Ci tego nie zmieni (zwłaszcza, jeśli w całej aplikacji w ogóle nie ma innych wątków, bo nie ma takiej potrzeby). Na dobrą sprawę, to nie pamiętam już kiedy musiałem debugować jakiekolwiek przypadkowe nulle dłużej niż pół minuty (w końcu debugger zawsze pokazuje gdzie się wywaliło i wystarczy w tamtej okolicy dopisać zapomniany null-check).

Cytat:
Jeżeli do wykonania czegoś, co można zapisać jednym zdaniem w języku naturalnym, musisz używać gigantycznej ilości kodu, to IMHO coś nie tak z designem.

Teza całkowicie pozbawiona podstaw jak dla mnie. Co powiesz na (dość popularne zdanie): "Chcę zrobić MMORPG jak WoW, tylko że lepszy"? ;)

Cytat:
W porównaniu z gigantyczną (i rozsianą po różnych miejscach kodu) implementacją dotyczącą sprawdzania każdego wskaźnika na nie-nullowość przed użyciem, to przejechanie po wszystkich wskaźnikach w jednym miejscu kodu to powinien być pikuś.

I właśnie doskonale opisałeś sens stosowania samonullujących się wskaźników. Wręcz banalna implementacja w jednym miejscu, zysk w całym kodzie. :)

Cytat:
// Dopisane: dobra, widzę już sens tego rozwiązania. Trzeba było pisać od razu, że chodzi o obronę przed pozostawieniem i użyciem jakiegoś zabłąkanego wskaźnika i zamianę niedeterministycznego segfaulta na deterministyczny w tej sytuacji (dereferencja nulla).

Ani trochę nie o to. Chodziło mi o klasyczne słabe referencje (weak_ptr z boosta), które mają masę zastosowań.

Cytat:
Aha, czyli w zasadzie równie dobrze można użytkownikom obiektu dawać wskaźnik na jakiś wskaźnik pośredni i wyjdzie na to samo.

Nie tak do końca: ID nie muszą wskazywać na konkretną pamięć, ID można bezpiecznie zapisać na dysku, itp, itd.
Dab
Feb 20, 2010

Odp: Samo-NULLujące smart pointery

Cytat:

Cytat:
Aha, czyli w zasadzie równie dobrze można użytkownikom obiektu dawać wskaźnik na jakiś wskaźnik pośredni i wyjdzie na to samo.

Nie tak do końca: ID nie muszą wskazywać na konkretną pamięć, ID można bezpiecznie zapisać na dysku, itp, itd.


Ale za to musisz mieć dodatkowy mechanizm translacji między ID a wskaźnikiem (obiektem)
Miałem na myśli takie coś:
[tt]struct Foo { ... };
struct Foo_for_general_public { Foo * real_foo_pointer; };[/tt]
w najprostszej wersji -- przy kasowaniu Foo wystarczy wtedy wyzerować real_foo_pointer.
Krzysiek K.
Feb 21, 2010

Odp: Samo-NULLujące smart pointery

Cytat:
Ale za to musisz mieć dodatkowy mechanizm translacji między ID a wskaźnikiem (obiektem)
Miałem na myśli takie coś:
struct Foo { ... };
struct Foo_for_general_public { Foo * real_foo_pointer; };
w najprostszej wersji -- przy kasowaniu Foo wystarczy wtedy wyzerować real_foo_pointer.

A kiedy masz zamiar zwolnić pamięć po real_foo_pointer? ;)
Dab
Feb 21, 2010

Odp: Samo-NULLujące smart pointery

Hm? Nie do końca rozumiem?
Krzysiek K.
Feb 22, 2010

Odp: Samo-NULLujące smart pointery

Cytat:
Hm? Nie do końca rozumiem?

Obiekt typu Foo_for_general_public też musisz kiedyś zwolnić, nie?
Dab
Feb 22, 2010

Odp: Samo-NULLujące smart pointery

A tak, no to dorzućmy (w C++) RC i jeżeli ilość odwołań == 0 && wskazywany obiekt == 0 to kasujemy Foo_for_general_public.
(cały czas o tym problemie myślę w kategoriach Obj-C gdzie RC jest niejako wbudowane)
Strony:
1 2 3