2011-12-21 5 views
2

특정 작업을 수행하는 데 사용하는 부스트 스레드 풀이 있습니다. 순수한 가상 함수 doWork(int total) = 0;이있는 Sensor 클래스도 있습니다. 요청이있을 때마다 주 프로세스가 필요한 센서 포인터를 가져오고 스레드 풀에 Sensor::doWork(int total)을 실행하도록 지시합니다.신호 잡기 C++

threadpool->schedule(boost::bind(&Sensor::doWork,this,123456)); 

동적으로 입력 센서의 라이브러리를로드하고 다른 사람이 세그먼테이션 폴트 (segfault)와 같은 결과 결함 코드가있는 경우, 따라서 내 통제 불능이다. 그래서 (내 주요 프로세스에서) Sensor::doWork(int total)에 의해 던져진 모든 오류를 처리하고, 스레드를 정리하고, 해당 센서 개체를 삭제하고, 오류가 발생한 콘솔을 어디서 알리는 방법이 있습니까?

+0

"신호 잡기"는 "segfault에서 복구"와 다른 점입니다. 전자가 가능하고, 후자가 불가능합니다. –

+0

동적 라이브러리가 segfault를 던지는 대신 신호를 잡는 방법이 있습니까? – joshua

+0

표준''C 라이브러리를 사용하여 신호를 잡을 수 있습니다. 그러나 그렇게 중요하지 않습니다. 중요한 것은 인과 관계입니다. 세그 폴트는 신호를 유발합니다. 그러나 신호는 segfault를 막을 수는 없습니다 (시간이 지나면 부족합니다). –

답변

0

SIGSEV을 잡기 위해 함수 콜백을 등록 할 수 있습니다. C에서는 signal을 사용하여이 작업을 수행 할 수 있습니다. 그러나 OS가 SIGSEV을 전송할 때 수행 할 수있는 일은 많지 않습니다 (꼭 필요한 것은 아닙니다). 당신은 당신의 프로그램이 어떤 주에 있는지를 정말로 알지 못합니다. 예를 들어, 힙, 부패 새로운 얻고 작업이 실패 할 수 있습니다 삭제, 너무도 평범한 간단한

std::cout << std::string("hello world") << std::endl; 

문 경우 힙이 할당 될 필요가에서, 메모리 때문에 작동하지 않을 수 있습니다.

최저

, 크리스토프

+0

그게 내가 지금 가지고있는 것이지만 정상적으로 스레드를 죽이고 Sensor 객체를 삭제할 수있는 방법이 있었으면합니다. . – joshua

1

당신은 당신이 그것을 잡은 거의 복구 할 방법이 없다, 그래서 당신은 당신의 프로그램 상태에 대한 보장이없는 경우에도 SIGSEGV을 가지고있는 경우.

타사 라이브러리로 작업 중이며 버그가있어 라이브러리 관리자가 문제를 해결하지 못했지만 (소스가없는 경우) 타사 라이브러리를 실행하는 것이 유일한 방법입니다 어떤 방식 으로든 메인 바이너리와 대화하는 완전히 별개의 바이너리 내에서. 예를 들어 firefox 및 plugin-container를 참조하십시오.

2

여기서 세그멘테이션 오류를 처리하는 유일한 방법은 프로세스에서 Sensor::doWork을 완전히 실행하는 것입니다.

UNIX에서는 fork (또는 다른 유사한 방법)을 사용하고 하위 프로세스에서 Sensor::doWork을 실행 한 다음 그 결과를 부모 프로세스로 다시 셔틀합니다.

Windows에서 비슷한 의미가 있다고 가정합니다.

편집 : 나는 당신이 할 수있는 일의 약간을 살살 낼 것이라고 생각했다.

해결 방법 # 1 : 스레드와 동일한 방식으로 프로세스로 작업 할 수 있습니다. 예를 들어, 작업

  • 반환 결과를 수행 파이프 나 큐 또는 일부 유사한 물체
  • 을 통해 전달하는 작업에 대해

    • 대기의 루프에 앉아서 프로세스 풀을 만들 수 있습니다 파이프 또는 대기열 또는 이와 유사한 객체 위에 게시

    다른 프로세스에서 작업을 실행하고 있으므로 충돌로부터 보호됩니다. 이 솔루션의 가장 큰 어려움은 실제로 프로세스간에 통신하는 것입니다. 어쩌면 부스트의 프로세스 라이브러리가 도움이 될 것입니다.나는 주로 파이썬에서 이런 종류의 작업을 수행했다.이 모듈은 표준 multiprocessing 모듈을 가지고있다.

    솔루션 # 2 : 응용 프로그램을 다른 프로세스에서 실행되는 "안전"및 "위험"부분으로 나눌 수 있습니다. "위험한"부분은 Sensor::doWork 메서드와 그 프로세스에서 수행하고자하는 다른 작업을 실행하지만 충돌 할 경우 자연스럽게 손실되는 것은 허용됩니다. "안전한"부분은 잃을 여유가없는 귀중한 정보를 다루고 어린이가 충돌 할 때 일부 복구 작업을 수행하여 "위험한"부분을 모니터링합니다. 그리고 물론, 당신이 안전한 부분에서하기를 원하는 것을 결정한 다른 작업.

  • +0

    풀에서이 작업을 수행 할 수있는 방법이 있으므로 하위 프로세스를 지속적으로 설정하지 않고 끝내기를 기다리고 있지 않습니까? 이것은 시간에 민감한 문제이므로 시간이 많이 걸릴 것으로 생각됩니다. – joshua

    +0

    너무 느리다는 것을 추측하지 마십시오. 실제 시도해보십시오. 그리고 당신은 심지어 하나의 자식 프로세스를 가지며 충돌하지 않는 한 계속 재사용 할 수 있도록 설정할 수 있습니다. 그러나 어쨌든, 여러분은 여러분의 프로세스를 손상시키는'doWork' 호출에 대해 매우 우려하는 것 같습니다. – Hurkyl

    +0

    그건 그렇고, 당신이 정말로 묻는 질문은'doWork' 호출에 의해 프로세스가 손상되는 것을 막는 것입니다. 별도의 프로세스에서'doWork'를 실행하는 것이 그 보호를 제공하는 유일한 합리적인 방법이라고 생각합니다. 부수적으로 세분화 오류는 일종의 부패의 증상 *입니다. 당신이 그것을 붙잡더라도, 당신의 프로그램은 아직도 타락하게 할 것 같다. – Hurkyl