문제

멀티 크레디 한 응용 프로그램에서는 Sleep () 함수 (GLFW 라이브러리에서 나온 기능)를 사용하고 있습니다.

glfwSleep(..);

그리고 그것은 통화 스택이 표시되는 것처럼 내 응용 프로그램을 segfaulting으로 이끌었습니다.

#0 76CFC2BC WaitForSingleObjectEx() (C:\Windows\system32\kernel32.dll:??)
#1 00000016 ??() (??:??)
#2 0000006C ??() (??:??)
#3 00000000 ??() (??:??)

그만큼 glfwSleep() 스레드 내부에서 사용됩니다. 위험합니까? 내 프로그램이 왜 그 결과로 분류 되는가?

편집하다:

의 매개 변수 일 때 glfwSleep() <0.02 (secs)는 segfault가 아닙니다!

편집 2 :

GLFW의 공식 문서에서 :

스레드 응용 프로그램을 작성하기 전에 스레드 응용 프로그램을 작성하는 것이 매우 어색 할 수 있지만, 따라야 할 간단한 몇 가지 주요 규칙이 있습니다.

  • 항상 스레드간에 공유되는 데이터에 대한 독점 액세스를 보장하십시오!
  • 스레드가 올바르게 동기화되어 있는지 확인하십시오!
  • 바쁘지 않아!

내 대답을 받았다고 생각합니다 .. 지금 대안을 찾으려고합니다 ..

감사!

도움이 되었습니까?

해결책

에서 GLFW 위키:

GLFW는 GHC 스레드, 포르 키오 또는 스레드 델레이에서 잘 작동하지 않습니다. 따라서 가능하다면 피하십시오.

다른 팁

segfault'ed 스레드가 glfwsleep ()의 발신자와 동일한 스레드입니까?

WaitformultipleObjectsex API의 호출로 인한 충돌로 보입니다. 올바른 동기화 객체 및 숫자를 WaitformultipleObjectsex로 지정하고 전달합니까?

인용합니다 실용적인 프로그래머,

``select '' '가 깨지지 않았습니다

OS 또는 컴파일러 또는 타사 제품 또는 라이브러리에서 버그를 찾는 것은 드 rare니다. 버그는 응용 프로그램에서 가장 가능성이 높습니다.

당신의 프로그램이 전화를하는 이유 WaitForSingleObjectEx() 언제 glfwSleep() 전화 Sleep()? 글쎄, 당신은 소스 코드가 없지만 Sleep(), 그것은 완전히 블랙 박스가 아닙니다. 분해 Sleep() 그리고 아마도 당신은 아마도 (당신이 가진 Windows 버전에 따라) Sleep() 전화 나 꼬리 집 SleepEx(). XP에서 SleepEx() 전화 NtDelayExecutionThread(), 그리고 Vista에서 그것은 전화합니다 WaitForSingleObjectEx().

그렇다면 나머지 스택은 어떻게 되었습니까? 00000016, 0000006C 및 00000000은 유효한 반환 주소가 아닙니다. 코드 어딘가에 스택 해소 된 버퍼에 대한 포인터를 다른 스레드로 전달하고 프로그램이 잠자는 동안 다른 스레드가 첫 번째 스레드 스택을 손상 시킨다고해서 놀라지 않을 것입니다. 들어가십시오 Sleep(), 리턴 주소에 메모리 중단 점을 넣으면 범인을 잡을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top