Krótki wstęp: Pracuję nad kodem wielowątkowym i muszę udostępniać dynamicznie przydzielane obiekty między dwoma wątkami. Aby uczynić mój kod czystszym (i mniej podatnym na błędy) chcę jawnie "usunąć" obiekty w każdym wątku i dlatego chcę użyć shared_ptr
.Narzut i implementacja za pomocą shared_ptr
Pierwsze pytanie:
Chcę wiedzieć, czy realizacja -> operator
w shared_ptr
ma jakiś dodatkowy narzut (np większy następnie unique_ptr
) w czasie wykonywania. Obiekty, o których mówię, to zazwyczaj instancje longlife kopiowane tylko raz po stworzeniu (kiedy rozprowadzam je między wątkami), wtedy uzyskuję dostęp tylko do metod i pól tych obiektów.
Mam świadomość, że shared_ptr
chroni tylko liczenie odwołań.
Drugie pytanie:
Jak dobrze zoptymalizowane są shared_ptr
w libstdC++? Czy zawsze używa muteksu lub wykorzystuje operacje atomowe (skupiam się na platformach x86 i ARM)?
W dobrej implementacji 'shared_ptr', powinno być zero narzutów podczas dereferencji wskaźnika przez' -> '. Nie jestem zaznajomiony z libstdC++, więc nie mogę odpowiedzieć na twoje drugie pytanie. Masz nagłówki, więc możesz łatwo dowiedzieć się, sprawdzając, w jaki sposób jest zaimplementowany. –
Jeśli kod jest wielowątkowy, współdzielony wskaźnik GCC używa 'std :: atomic' lub coś podobnego do licznika odwołań; czy to prawdziwy sprzętowy (blokujący) atomowy zależy od wersji kompilatora - uważam, że poprawiono to w GCC 4.7.0. –
Kopiowanie/przypisywanie/wychodzenie z zakresu ma dodatkowy narzut z powodu przyrostu wartości wątków w repozytorium. 'operator->' wygląda dokładnie tak samo, jak starego dobrego 'auto_ptr', tzn. można oczekiwać, że będzie to zero narzutów. – Damon