Jak bezpiecznie usuwać statyczne obiekty C++ w przypadku, gdy wiele wątków (Posix) wywołuje jednocześnie exit()
?bezpieczne niszczyciele statyczne, gdy wiele wątków wywołuje exit()
Wydaje się w moim otoczeniu CentOS6 że exit()
wykonuje atexit
(lub on_exit
) czyszczenia ładowarki wywołując coś podobnego fct[--cnt]()
gdzie cnt
jest liczba zarejestrowanych koparki. Gdy wiele wątków wywołuje w tym samym czasie exit()
, mamy warunki wyścigu w niezabezpieczonej operacji --cnt
, a niektóre programy obsługi mogą być pomijane lub wywoływane wiele razy (co prowadzi do sporadycznych awarii). Jak mogę się upewnić, że tylko jeden z wątków wywołujących exit()
powoduje czyszczenie i wszystkie inne kończą się? Należy pamiętać, że wstawienie pthread_mutex_lock()
do obsługi czyszczenia nie pomoże, bo to handler może zostać pominięty ...
Niestety nie można uniknąć, że wiele wątków zadzwonić exit()
bo to kod moi użytkownicy będą pisać (mam zapewniając biblioteka dla nich).
Szukasz bezpiecznych pomysłów, dzięki!
O co właściwie się martwisz? Czy masz coś w swoich statycznie przydzielonych obiektach, które MUSZĄ zostać sklasyfikowane (jeśli tak, to co)? Zasadniczo bezpieczne jest wyjście bez czyszczenia w nowoczesnych, wyrafinowanych systemach operacyjnych. Jeśli MUSISZ wykonać czyszczenie, sugerowałbym, że prawdopodobnie będziesz potrzebował znaleźć lepsze rozwiązanie niż pozwolić na wywołanie swojego kodu klienta - np. Zaimplementuj kod we współdzielonej bibliotece i użyj funkcji czyszczenia współdzielonej biblioteki, aby wyczyścić, być może ? Albo udokumentuj, że "nie możesz wywoływać' exit() ', używaj' my_safe_exit() '", a następnie odwołuj się do tego, gdy klienci skarżą się, że to nie działa. –
Co się stanie, jeśli twoi klienci się zawierują (błąd stosu, błąd seg) lub debugowanie i wychodzenie z debuggera bez wywoływania w ogóle wyjścia? –
Mam kilka obiektów statycznych, które C++ zniszczą, ale nie będą mogły bezpiecznie działać równolegle (stan wyścigu w destruktorach).To oczyszczanie jest potrzebne, na przykład, aby właściwie zamknąć strumienie plików śledzenia, więc automatyczne czyszczenie przez system operacyjny nie jest opcją. – Rainer