병렬 프로그램에서 오류를 처리하는 가장 좋은 방법은 무엇입니까?


11

병렬 알고리즘이 문을 두드리면 오류 처리에 대해 생각하는 것이 좋습니다.

처음에는 오류 코드가있었습니다. 그들은 빨려 들었다. 그것들을 무시해도되므로 실패 할 수 있으며 디버그하기 어려운 코드를 생성 할 수 있습니다.

그런 다음 예외가 발생했습니다. 일단 발생하면 무시할 수 없게되었고 대부분의 사람들 (Joel 제외)은 더 좋아합니다.

이제 병렬 코드를 도와주는 라이브러리가 생겼습니다. 문제는 병렬 코드가 아닌 코드를 사용하는 것만 큼 쉽게 병렬 코드에서 예외를 처리 할 수 ​​없다는 것입니다. 비동기식으로 작업을 시작하고 예외가 발생하면 스택 추적을 해제 할 때까지 추적 추적이 없습니다. 할 수있는 최선의 방법은 해당 개체가있는 경우이를 캡처하여 작업 개체에 등록하는 것입니다. 그러나 예외의 주요 강점을 물리칩니다. 예외를 확인해야하며 추가 노력없이 무시할 수 있습니다 . 단일 스레드 코드에서는 예외가 반드시 적절한 조치를 트리거합니다 (프로그램 종료를 의미하더라도).

언어 구현 또는 라이브러리는 병렬 코드의 오류를 어떻게 지원해야합니까?


2
이것이 stackoverflow에 속하지 않아야 합니까?
Graviton

@Ngu Soon Hui 주관적이고 반드시 존재하지 않는 기능에 관한 것이므로 여기에 속한다고 생각합니다.
zneak

그러나 프로그래머가 아니라 프로그래밍에 관한 것입니다. :)
bzlm

1
@bzlm FAQ에 따르면 "프로그래머-Stack Exchange는 소프트웨어 개발에 대한 주관적인 토론에 관심이있는 전문 프로그래머를위한 것입니다." SO는 주관적인 토론을 명시 적으로 권장하지 않습니다.
zneak

답변:


2

처리 할 수 있는 오류에 대한 콜백을 좋아 합니다. 그리고 그들은 비동기식으로 잘 작동하도록 만들 수 있습니다 ...

그러나 처리 할 수없는 오류 , 정말로 예외적 인 오류의 경우 오히려 관련 정보가 저장되고 프로그램이 종료되는 것을 볼 수 있습니다. 이것은 일반적으로 일종의 전역 오류 처리기를 통해 수행되므로 예외를 이것을 위해 작동하는 것으로 바꿀 필요가 없습니다.하지만 중요한 오류를 감지하고 메모리 덤프를 생성하는 등 플랫폼 지원 이 더 좋습니다.


두 번째 콜백입니다. 위의 아이디어는 나에게 완벽하게 보입니다.
Pax Noctis

-2

작업이 자체 예외를 처리했는지 확인한 다음 호출 프로그램에 스레드를 종료해야한다는 것을 알려주는 것을 반환하는 것처럼 보입니다. 그런 다음 일부 스레드가 실패했음을 알고 모든 스레드의 결과를 처리하는 논리를 갖습니다.


5
"무엇을 반환"-누구? 발신자가 이미 이동했습니다.
Mark H

@ sparkie가 말했듯이 그렇게 할 수는 없습니다. 통화 스택을 코 루틴의 루트로 유지하더라도 발신자는 아마도 멀리있을 것입니다. 내가 언급 한 바와 같이 그들은 당신의 중지, 그래서 예외 설계된 프로그램을 , 지금 . 예외를 눈치 채지 못할 수 있으므로 나중에 직접 확인하면 완전히 패배합니다.
zneak

@ Zneak, (표준) 정의를 사용하지 않는 예외를 언급했을 때 오류가 발생했다고 생각했습니다. 모든 기능이 완료된 후 어딘가로 돌아 가야합니다. 그 시점에서 "예외"/ 오류를 처리 할 수 ​​있습니다 (해당 레벨에서). 나는 왜 너희들이 호출 프로그램을 멀리 언급하고 있는지 잘 모르겠다. 함수의 반환 값은 어쨌든 처리되어야한다. 스레드의 결과가 서로 의존적으로 메쉬되면 이것이 거의 작동하지 않는다는 것을 알고 있습니다.

1
모든 병렬 작업이 어딘가에서 "돌아 오는"것은 아닙니다. 예를 들어, 메인 스레드에서 다른 작업을 수행하는 동안 긴 작업을 별도의 스레드에 위임하면 제대로 완료되었는지 궁금해 할 수 있습니다. 예를 들어 보조 스레드에서 파일에 쓰는 이미지 에디션 소프트웨어를 작성하고 작업이 시작되는 즉시 저장 대화 상자에서 돌아올 수 있습니다. 추가 작업을 위해 반환 값이 필요하지 않으므로 오류를 제외하고는 확인할 이유가 없습니다.
zneak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.