2014-09-26 4 views
1

우분투에서 실행되는 멀티 스레드, 단일 코어 응용 프로그램을 만들었습니다.getaddrinfo 및 gethostbyname이 자식 스레드에서 호출되면 충돌이 발생합니까?

주 프로세스에서 getaddrinfogethostbyname을 호출하면 충돌이 발생하지 않습니다.

그러나 주 프로세스에서 스레드를 만들 때 함수 getaddrinfogethostbyname이 생성 된 스레드에서 호출되면 항상 충돌합니다.

친절히 도움. 아래의 호출 스택을 찾아주세요 :

#0 0xf7e9f890 in ??() from /lib/i386-linux-gnu/libc.so.6 
#1 0xf7e9fa73 in __res_ninit() from /lib/i386-linux-gnu/libc.so.6 
#2 0xf7ea0a68 in __res_maybe_init() from /lib/i386-linux-gnu/libc.so.6 
#3 0xf7e663be in ??() from /lib/i386-linux-gnu/libc.so.6 
#4 0xf7e696bb in getaddrinfo() from /lib/i386-linux-gnu/libc.so.6 
#5 0x080c4e35 in mn_task_entry (args=0xa6c4130 <ipc_os_input_params>) at /home/nextg/Alps_RT/mn/src/mn_main.c:699 
#6 0xf7fa5d78 in start_thread() from /lib/i386-linux-gnu/libpthread.so.0 
#7 0xf7e9001e in clone() from /lib/i386-linux-gnu/libc.so.6 
+1

코드를 표시하지 않았습니다. gdb를 사용하는 방법을 배울 시간. – vanza

+0

'gethostbyname'은 재진입이 필요하지 않으므로 여러 스레드에서 호출 된 경우 스레드 안전성이 떨어질 수 있습니다. 'glibc'를 C 라이브러리로 사용한다면'gethostbyname_r'을 사용하여 문제를 해결할 수 있습니다. –

답변

1

한다 getaddrinfo이 때문에 충돌 한 이유는, 호출하는 자식 스레드가 충분한 스택 공간이 없었다.