Jaki byłby najlepszy sposób radzenia sobie z błędami w programach równoległych?

11

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?

skradać się
źródło
2
Czy nie powinno to należeć do stackoverflow ?
Graviton,
@Ngu Soon Hui To subiektywne i dotyczy funkcji, które niekoniecznie istnieją, więc myślę, że należy tutaj.
zneak
Ale chodzi o programowanie, a nie programistów. :)
bzlm
1
@bzlm FAQ mówi „Programiści - Stack Exchange jest przeznaczony dla ekspertów programistycznych, którzy są zainteresowani subiektywnymi dyskusjami na temat rozwoju oprogramowania”. a SO wyraźnie zniechęca do subiektywnych dyskusji.
zneak

Odpowiedzi:

2

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.

Shog9
źródło
Drugie oddzwanianie. Powyższy pomysł wydaje mi się całkiem idealny.
Pax Noctis,
-2

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
5
„zwracanie czegoś” - komu? Dzwoniący już się przeprowadził.
Mark H
Jak powiedział @sparkie, nie możesz tego po prostu zrobić. Nawet jeśli trzymasz stos wywołań jako korzeń dla korporacji, osoba dzwoniąca prawdopodobnie będzie daleko, daleko. Jak już wspomniałem, wyjątki zostały tak zaprojektowane, aby ich zatrzymać programu , teraz . Sprawdzanie go później całkowicie go pokonuje, ponieważ wyjątki mogą zostać niezauważone.
zneak
@Zakładnie, przypuszczam, że kiedy wspomniałem o wyjątkach, że nie używałem twojej (standardowej) definicji, miałem na myśli, że błąd został wykryty. Po zakończeniu jakiejkolwiek funkcji musi gdzieś wrócić, w tym momencie można rozwiązać „wyjątek” / błąd (na tym poziomie). Nie jestem pewien, dlaczego mówicie o tym, że program wywołujący jest tak daleko, każda wartość zwrotna z funkcji musi zostać w jakiś sposób rozwiązana. Zdaję sobie sprawę, że to nie będzie działać tak dobrze, jeśli wyniki wątków będą się ze sobą zazębiać.
1
Nie wszystkie równoległe zadania gdzieś „wracają”. Na przykład, możesz po prostu delegować długie zadanie do osobnego wątku, robiąc coś innego w głównym wątku ((niesłusznie), nie zastanawiając się nawet, czy zostało poprawnie wykonane. Na przykład mógłbym napisać oprogramowanie do edycji obrazów, które zapisuje pliki z drugiego wątku, i powrócę z okna dialogowego zapisu, jak tylko zadanie zostanie uruchomione. Nie będę potrzebował zwracanej wartości, bez względu na to, jaka jest, do jakiejkolwiek dalszej operacji, więc poza błędami nie ma powodu, aby to sprawdzać.
zneak