2013-06-13 3 views
0

C++ 11 thread 클래스를 사용하여 스레드를 만들었습니다. 스레드를 루프에서 잠자기 상태로 만들고 싶습니다. 변수 '_Now'주위에 스택 손상 이었다 - C++ 11 스레딩에서 스레드 잠김 오류가 발생했습니다.

가 확인 실패 # 2 런타임은 다음 this_thread::sleep_for() 함수가 호출 될 때
, 내가 말하는 예외를 얻을.

내 코드는 다음과 같습니다 :

std::chrono::milliseconds duration(5000); 
while (m_connected) 
{ 
    this->CheckConnection(); 
    std::this_thread::sleep_for(duration); 
} 
+1

오류가'CheckConnection'이 아닌'sleep_for'에 있습니까? 어떤 컴파일러를 사용합니까? – ForEveR

+0

은 sleep_for()의 구현에 _ 변수가 있습니까? –

+0

VS2012를 사용하여 컴파일합니다. @ForEveR – xyzt

답변

0

내가 _Nowsleep_for의 구현 어딘가에 깊은 지역 변수 추정. 손상된 경우 해당 기능에 버그가 있거나 (가능성이 없음) 응용 프로그램의 다른 일부가 매달 리 포인터에 쓰고 있습니다 (가능성이 훨씬 높음).

가장 큰 원인은 sleep_for을 호출하기 전에 잠시 동안이 스레드가 잠자기 상태 인 동안 다른 스레드에서 남긴 로컬 변수에 대한 포인터를 제공한다는 것입니다.

Linux를 사용하는 경우 valgrind을 시도하는 것이 좋지만 (스택에 대한 잘못된 액세스를 잡을 수 있다고 확신 할 수는 없지만) Windows에서는이 종류의 문제를 디버깅하기위한 도구에 대해 알지 못합니다. . 신중한 검토를 할 수 있으며 기능의 여러 부분을 비활성화하여 문제가 언제 어디로 가라 앉는 지 확인할 수 있습니다.

나는 또한 성공적으로 duma 라이브러리를 사용했지만 스택이 아닌 힙에 대한 잘못된 액세스 만 잡을 수 있습니다.

참고 : clang과 gcc는 모두 MSVC++보다 C++ 11을 구현하는 데 더 많은 시간이 걸리므로 많은 Windows 관련 항목을 사용하지 않으면 쉽게 포트를 지정하고 해당 항목에 대한 valgrind를 시도 할 수 있습니다. GCC 및 특히 clang은 MSVC++보다 훨씬 더 나은 정적 진단을 제공하는 것으로 알려져 있기 때문에 gcc 또는 clagn을 사용하여 컴파일하면 문제를 지적하는 경고가 표시 될 수 있습니다.

+0

'std :: this_thread :: sleep_for'는 표준 라이브러리 함수입니다. 어떻게 로컬 일 수 있습니까? _ 이제 손상 될 수 있습니까? 나는 그것을 접근하지 않는다. @Jan Hudec – xyzt

+0

@xyzt : 지역 변수가 스택에 할당된다. 이전에 호출 된 로컬 함수의 다른 변수가 동일한 주소에 할당되었으므로 포인터를 어딘가에 두었습니다. 이제는 스택에 다른 로컬 배열이 있고 유효하지 않은 오프셋을 작성합니다 (음수/공통 플랫폼에서 스택이 커짐에 따라 랩 할만큼 충분히 높습니다).이 로컬 변수가있는 곳입니다. –

관련 문제