Thread 프로그램의 GDB 디버깅에서 의문점...
글쓴이: khk / 작성시간: 수, 2003/04/02 - 7:07오후
소스코드는 매우 간단합니다.
thread 2개가 생성되어 하나는 a만 찍고 다른 하나는 b만 찍는 예제입니다.
/* Creates two threads, one printing 10000 "a"s, the other printing 10000 "b"s. Illustrates: thread creation, thread joining. */ #include <stddef.h> #include <stdio.h> #include <unistd.h> #include "pthread.h" void * process(void * arg) { int i; fprintf(stderr, "Starting process %s\n", (char *) arg); for (i = 0; i < 10000; i++) { write(1, (char *) arg, 1); } return NULL; } int main(void) { int retcode; pthread_t th_a, th_b; void * retval; retcode = pthread_create(&th_a, NULL, process, (void *) "a"); if (retcode != 0) fprintf(stderr, "create a failed %d\n", retcode); retcode = pthread_create(&th_b, NULL, process, (void *) "b"); if (retcode != 0) fprintf(stderr, "create b failed %d\n", retcode); retcode = pthread_join(th_a, &retval); if (retcode != 0) fprintf(stderr, "join a failed %d\n", retcode); retcode = pthread_join(th_b, &retval); if (retcode != 0) fprintf(stderr, "join b failed %d\n", retcode); return 0; }
이 놈을 GDB로 디버깅해보려고 다음과 같이 수행하였습니다.
$ gdb th1 GNU gdb Red Hat Linux (5.1.90CVS-5) Copyright 2002 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux"... (gdb) break 1 Breakpoint 1 at 0x8048550: file th1.c, line 1. (gdb) run Starting program: /u/sde/khk/gdbtest/th1 [New Thread 1024 (LWP 15943)] [New Thread 2049 (LWP 15944)] [New Thread 1026 (LWP 15945)] [Switching to Thread 1026 (LWP 15945)] Breakpoint 1, process (arg=0x40828be0) at th1.c:11 11 { (gdb) where #0 process (arg=0x40828be0) at th1.c:11 #1 0x4001a0df in pthread_start_thread_event () from /lib/i686/libpthread.so.0 (gdb)
위의 gdb에서 이 부분이 이해가 잘 안갑니다.
Quote:
[New Thread 1024 (LWP 15943)]
[New Thread 2049 (LWP 15944)]
[New Thread 1026 (LWP 15945)]
[Switching to Thread 1026 (LWP 15945)]
수행이 11번 라인(여기까지 수행코드 없음)에서 break 되었는데 run 하자마자 3개의 thread가 생성되는 걸로 나옵니다.
main()에서 pthread_create()를 수행도 하기 전에 thread가 생성되는 이유를 알고 싶습니다.
아시는 분 계시면 답변 좀 부탁드립니다 ^^
Forums:
메인, 관리용 두개가 있습니다.
메인 쓰레드와 관리용 쓰레드가 있기 때문입니다. 리눅스용 쓰레드관련 글을 읽으시면 더 쉽게 이해하실 수 있습니다.
========================================
* The truth will set you free.
답변 감사합니다만....
메인 스레드를 포함하여 3개의 스레드가 생기는건 알겠습니다.
그러나 GDB에서 pthread_create() 호출 전에
스레드가 먼저 쫘악 생성되는 이유를 알고 싶습니다...
아시는 분 답변좀 부탁...
댓글 달기