pthread_join()에 문제가....
for(i=0; i<10000; i++) { if ((error = pthread_create(wrt_thread + i, NULL, (void *)process_fd, my_arg))) { fprintf(stderr, "Failed to create thread: %s\n", strerror(error)); wrt_thread[i] = pthread_self(); //여기서 쓰레드가 'Cannot allocate memory' 에러로 인해 더이상 생성 되지 않을 때, (제 리눅스에선 MAX가 255개) //기존의 쓰레드가 완료 될 때까지 기다리게 했습니다. for (j=0; j<i; j++) { if (pthread_equal(pthread_self(), wrt_thread[j])) continue; if ((error = pthread_join(wrt_thread[j], NULL))) { fprintf(stderr, "[%d] Failed to join thread: %s\n", j, strerror(error)); switch(error) { case EINVAL: // fprintf(stderr, "1\n"); break; case ESRCH: // fprintf(stderr, "2\n"); break; } } else { fprintf(stderr, "!!!\n"); } fprintf(stderr, "in %d\n", j); } } }
근데 자꾸 시그먼트폴트 에러가 나는 군요..
GNU gdb 6.3
Copyright 2004 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 "i686-pc-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) run
(생략)
.
.
.
.
[Thread 1980966848 (LWP 26465) exited]
[Thread 1989355328 (LWP 26466) exited]
[Thread 1997743808 (LWP 26467) exited]
[Thread 2006132288 (LWP 26468) exited]
[Thread 2014520768 (LWP 26469) exited]
[Thread 2022909248 (LWP 26470) exited]
[Thread 2031297728 (LWP 26471) exited]
[Thread 2039686208 (LWP 26472) exited]
[Thread 2048074688 (LWP 26473) exited]
[Thread 2056463168 (LWP 26474) exited]
[Thread 2064851648 (LWP 26475) exited]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1074090624 (LWP 26350)]
0x4002fe67 in pthread_join () from /lib/tls/libpthread.so.0
(gdb) bt
#0 0x4002fe67 in pthread_join () from /lib/tls/libpthread.so.0
#1 0x080498d9 in main (argc=1, argv=0xbffff9b4) at mo_test.c:461
(gdb) quit
참고로 쓰레드 하나당 join을 붙였을 땐 잘 돌아갑니다. 그치만 하나당 join을 붙여버리면 쓰레드 사용할 이유가 없는것 같군요...
pthread_join에 문제가 있는것 같은데 제 커널 버전은
"Linux develop 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux"
입니다.
누가 아시는 것 있음, 말씀 좀 부탁드립니다.
PS - goto문으로 돌리거나 sleep 주는 방법 말구요.. (ㅡ,.ㅡ;;)
흠... 혹시 open mp 나 fork() 로 오해하신게 아니신지...
각각의 쓰레드는 위의 코드를 실행하는게 아니라 process_fd로 지정된 주소의 함수를 실행하게 됩니다.
쓰레드 생성이 실패하게 되면.. 실패한 쓰레드 자체가 생성되지 못하므로 다른 쓰레드를 대기한다는 것 자체가 불가능합니다.
님ㅎ 즐~
답변 감사드립니다.
우선 답변 감사드리구요..
좀 더 간단히 코딩 했는데... 그래도 pthread_join에서 시그먼트 에러가 나네요...
이유를 도무지 모르겠어요..
쓰레드 쪼인...
다시 물 속으로 들어간 인간.
흠... join 루프 카운트를 무작정 100까지 하지 마시구
실제 생성된 쓰레드 카운트만큼 하시는게 어떨까 합니다.
아마 100개가 생성이 안되어서 그런 듯 하네요.
그래서 초기화되지 않은 wrt_thread[i] 에 대하여 join을 해서요.
님ㅎ 즐~
아.. 해결 했네요..
typedef struct _tmp_thread_rec {
int flag;
pthread_t ipd;
struct _tmp_thread_rec * next;
} tmp_thread_rec;
쓰레드 상태 관리하는 큐하나 만들어서
시작하는 놈 플래그 1, 끝나는 놈은 0 일케 해서
끝난놈은 끝난거고,... 플래그 1만 가지는 쓰레드 ipd값으로 쪼인 했더니 쪼인 잘 됩니다.
글고 문제가 ㅤㄷㅚㅆ던게 쪼인도 쪼인이지만 생성할 때 pthread 맥스값이 255 넘어가면서 값이 꼬이더군요..
예로 MAX가 5라 치면
1, 2, 3, 4, 5, 6(에러발생),
1, 2, 3, 4, 5 중 끝나는 놈 기달림
기다리다가 끝난 놈 thread값을 가져가야 할 텐데 끝나지도 않은
5의 값을 가져감...
그래서 생성 thread값을 덤프시켜 보니
1,2,3,4,5,5,4,3,2,1 일케 가더라구요...
그니까 쪼인도 안되고...
아후 저 이것 땜시 2주동안 슬럼프에다 오만 우울증까지 겹쳐서리..
아 오늘 발 뻗고 자겠심... ^^
그려서 따로이 pthread id를 관리하는 배열을 만들어 활용하심이 좋으실듯...
해결 코드..
다시 물 속으로 들어간 인간.
댓글 달기