2010-01-21 4 views
0

필자는 평생 동안 여러 스레드를 가져오고 찢어 버리는 프로그램을 가지고 있습니다. 모든 것이 잠시 잘 작동하지만 결국에는 다음 코어 덤프 스택 추적을 얻습니다.시동시 코어 드릴링 향상시키기

#0 0x009887a2 in _dl_sysinfo_int80() from /lib/ld-linux.so.2 
#1 0x007617a5 in raise() from /lib/tls/libc.so.6 
#2 0x00763209 in abort() from /lib/tls/libc.so.6 
#3 0x003ec1bb in __gnu_cxx::__verbose_terminate_handler() from /usr/lib/libstdc++.so.6 
#4 0x003e9ed1 in __cxa_call_unexpected() from /usr/lib/libstdc++.so.6 
#5 0x003e9f06 in std::terminate() from /usr/lib/libstdc++.so.6 
#6 0x003ea04f in __cxa_throw() from /usr/lib/libstdc++.so.6 
#7 0x00d5562b in boost::thread::start_thread() from /h/Program/bin/../lib/libboost_thread-gcc34-mt-1_39.so.1.39.0 

처음에는 스레드를 유출하고, 코어는 현재 스레드의 수의 일부 최대 한계 치는 때문 생각하지만, 지금은이 문제는 내가하지 않는 경우에도 발생하는 것으로 보인다되었다. 참고로, 위 코어에는 13 개의 활성 스레드가 실행 중입니다.

start_thread가 핵심이되는 이유를 알아 내려고 시도했지만 검색 결과를 찾지 못했습니다. 누구든지 아이디어가 있습니까?

+0

디버거의 코드를 단계별로 실행 하시겠습니까? – jalf

답변

2

start_thread이 잡히지 않은 예외를 던지고 있습니다. start_thread이 던져 질 수있는 예외를 확인하고 그 주위에 catch을 배치하여 문제가 무엇인지 확인하십시오.

+0

파기를 한 후에는 thread_resource_error가 던져 질 수있는 예외 인 것처럼 보입니다. 내가 쓰레드를 새지 않으면, 왜 이것이 던져 질 것인가? –

+0

그 예외는 지금 당신에 의해 잡혀 있습니까? 스레드 스택 메모리가 부족하거나 파일 설명자가 부족할 수 있습니다. 또는 이미 끝난 스레드가 자원을 확보하지 않거나 프로그램에 참여할 때까지 자원을 확보하지 않아도됩니다. –

0

thread_resource_error가 전달하는 값은 무엇입니까? 찾으려면 native_error()를 호출 할 수있는 것 같습니다.

이것은 pthreads에 대한 래퍼이므로 EAGAIN, EINVAL 및 EPERM 중 몇 가지 가능성이 있습니다. boost가 EINVAL과 EPERM에 대해 던질 가능성이있는 예외 (예 : unsupported_thread_option() 및 thread_permission_error())가있는 것처럼 보입니다.

거의 EAGAIN을 남겨 두어 스레드 수에 대한 시스템 제한을 실제로 초과하지 않는지 두 번 확인합니다. 당신은 당신이 그들과 합류하고 있다고 확신합니까, 아니면 분리되었을 때, 그들은 정말로 없어 졌습니까?

관련 문제