2010-08-19 6 views
4

나는주 스레드와 비교하여 보조 스레드에서 충돌하는 것이 유리합니까?

DWORD WINAPI ThreadFunc (LPVOID lpParam) 
{ 
    int *x = 0; 
    *x = 1234; // Access violation 

    return 0; 
} 

void Manager::Crash() 
{ 
    Log("Received a remote command to crash Server."); 

    DWORD dwThreadId, dwThrdParam = 1; 
    HANDLE hThread = ::CreateThread(NULL, 0, ThreadFunc, &dwThrdParam, 0, &dwThreadId); 
} 

내 질문은 큰 코드베이스에서이 코드를 건너 온 : 왜 스레드를 사용? ThreadFunc의 코드가 Manager::Crash에서 직접 수행 된 경우 스레드 안전성이 어느 정도입니까? 나는 충돌을 제거한 경우에 대비하여 변경을 꺼린다.

+0

이 코드를 어디에서 받았습니까? – Maz

+1

재미있는 사고 실험이지만 위대한 제목은 아닙니다. "기본 스레드 대 보조 스레드에서 충돌하는 것이 유리합니까?" –

+0

@quixoto : 좋은 제목, 고정. @ 마즈 : 왜? –

답변

5

그는 예외 발생을 처리하고 싶지 않습니다. Manager::Crash을받은 원본 스레드가 계속됩니다. AV 예외가 반드시 프로세스를 종료하지는 않습니다. 이 경우 __try/__except 블록으로 처리되지 않는 사실 (참고로 C++가 아닌 SEH try block) 처리되지 않은 second chance 예외 프로세스를 종료합니다. 하지만 아마도 Dr. Watson/WER을 실행하거나 post-mortem debugger을 실행하거나 현재 디버거를 중단하려고 할 수 있습니다. 누가 알 겠어 ...

사실, 이런! 주 스레드 SEH 처리기가 설치되어 있으면 프로세스가 중단되지 않습니다. QED.

+1

"그는 예외 처리를 원하지 않습니다. 원래 스레드는 SEH 블록을 가지고 있으며이를 잡을 것입니다." – GManNickG

+0

@GMan : Yeap, 나는 그것이 메인 스레드 (들)에 설치된 SEH를 피하는 것이 확실하다. 'D'오 '순간을 편집 한 직후에 당신의 코멘트를 보았습니다. –

+2

이것은 코드에서 논평할만한 가치가있는 것입니다. – jamesdlin

0

우리가 보지 못하는 스레드 이후에해야 할 일이 많다면 별도의 스레드에있는 이유는 없습니다. 나는 메인 스레드가 어떤 이유로 그것을 잡는 것 같아요. 나는 그것이 오히려 그것을 잡을 것이고, 그 다음에 그것이 개인적으로 꼭대기로 퍼 올리게된다.

왜 서버를 크래시합니까? 나에게 좋지 않은 디자인 선택의 소리가 난다.

+0

사후 부검 덤퍼 및 오류보고 인프라를 테스트해야한다면 어떨까요? 요구에 따라 프로세스를 중단시키는 방법은 편리합니다. –

+0

@Remus : 이것이 단위 테스트가있는 이유입니다. –

+1

@ 0A0D :이 부분은 일부 단위 테스트 인프라의 일부가 될 수 있습니다. :) –

1

우선 프로그래머가 쓴 것을 묻는 것이 좋겠지 만, 주 스레드에서 segfaults를 잡도록 설계된 예외 처리기를 둘러싼 스레드와 충돌하는 이유가있을 수 있습니다. 소스 컨트롤의 시간 경과보기를 깨고 가해자에게 이메일을 보내기 좋은 시간이 될 것입니다.

그런데 CPU 예외를 유도하는 데는 불필요하게 어색한 방법이기도합니다. 예 :__debugbreak() 또는 인라인 어셈블리 int 3을 사용하여 직접 충돌 또는 중단 점을 트리거 할 수 있습니다. 그 결과 프로그램은 즉시 디버거에 침입합니다. 디버거가 연결되어 있지 않으면 대부분의 MSVC 프로그램에서 기본적으로 코어를 덤프합니다.

+0

+1 이것이 일어난다는 것을 확신하고 싶다면 충돌을 일으키기위한 상당히 합작적인 방법이라는 것을주의하십시오. –

관련 문제