Przy równoległych algorytmach pukających do drzwi może być dobry moment, aby pomyśleć o obsłudze błędów.
Więc na początku były kody błędów. Ci ssani. Można było je zignorować, abyś mógł późno zawieść i stworzyć trudny do debugowania kod.
Potem przyszły wyjątki. Nie można ich zignorować, gdy się pojawią, a większość ludzi (z wyjątkiem Joela) bardziej je lubi.
A teraz mamy biblioteki, które pomagają w równoległym kodzie. Problem polega na tym, że nie można obsługiwać wyjątków w kodzie równoległym tak łatwo, jak to możliwe w przypadku kodu nierównoległego. Jeśli asynchronicznie uruchomisz zadanie i zgłasza ono wyjątek, nie ma śladu stosu obok niego, aby się zrelaksować; najlepiej, co możesz zrobić, to przechwycić go i zarejestrować w obiekcie zadania, jeśli taki obiekt istnieje. Jednak pokonuje podstawową siłę wyjątków: musisz je sprawdzić i możesz je zignorować bez dodatkowego wysiłku , podczas gdy w kodzie jednowątkowym wyjątek koniecznie wywoła odpowiednie działania (nawet jeśli oznacza to zakończenie programu).
W jaki sposób implementacje językowe lub biblioteki powinny obsługiwać błędy w kodzie równoległym?
źródło
Odpowiedzi:
Raczej lubię oddzwanianie za błędy, które można naprawić. I można sprawić, że będą działać asynchronicznie…
Ale w przypadku błędów, których nie można naprawić, naprawdę wyjątkowych błędów, wolałbym, aby odpowiednie informacje zostały zapisane i program został zakończony. Ponieważ i tak zwykle odbywa się to za pomocą globalnej procedury obsługi błędów, nie widzę potrzeby przekręcania wyjątków w coś, co działa w tym przypadku - ale lepsza obsługa platformy w zakresie wykrywania błędów krytycznych i tworzenia zrzutów pamięci itp. Byłaby miła.
źródło
Wygląda na to, że chciałbyś się upewnić, że zadanie poradzi sobie z własnymi wyjątkami, a następnie zwróci coś, co poinformuje program wywołujący, że wątek musi zostać zamknięty. Miałoby wtedy logikę przetwarzania wyniku wszystkich wątków, wiedząc, że niektóre z tych wątków zawiodły.
źródło