심심(?)해서 pthread를 1회성으로 구동하고 죽게 냅두면 어떻게 되나 궁금해서 해봤는데
메모리 16GB 시스템에서 32753개 정도까지 밖에 구동 못하고 메모리를 할당할 수 없다고 죽는다.
user space 메모리는 문제가 없는 것 같은데 커널 메모리를 다 먹어 버린건가?
$ cat main.c #include <stdio.h> #include <pthread.h>
void *func(int *val) { printf("hello %d\n", *val); }
void main() { pthread_t pt; int pid = 0; int i = 0; for(i = 0; i < 100000; i++) { pid = pthread_create(&pt, NULL, func, &i); if (pid > 0 ) { perror("thread create error"); exit(0); } } } |
$ gcc main.c -lpthread $ ./a.out hello 32753 thread create error: Cannot allocate memory |
$ top top - 10:16:37 up 8 days, 23:07, 3 users, load average: 0.39, 0.24, 0.09 Tasks: 363 total, 3 running, 293 sleeping, 0 stopped, 0 zombie %Cpu(s): 6.2 us, 25.0 sy, 0.0 ni, 66.2 id, 0.0 wa, 0.0 hi, 2.5 si, 0.0 st KiB Mem : 16169232 total, 808336 free, 2131900 used, 13228996 buff/cache KiB Swap: 2097148 total, 2095356 free, 1792 used. 13436824 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 25250 minimonk 20 0 0.107t 117784 1584 R 131.8 0.7 0:00.29 a.out 22599 minimonk 20 0 110440 6228 4996 R 81.8 0.0 0:17.60 sshd 21729 root 20 0 0 0 0 I 9.1 0.0 0:00.11 kworker/u16:3-e 22764 root 20 0 0 0 0 I 9.1 0.0 0:01.27 kworker/u16:2-e 17413 root 20 0 0 0 0 I 4.5 0.0 0:02.40 kworker/4:0-eve 18086 root 20 0 0 0 0 I 4.5 0.0 0:02.63 kworker/5:0-eve 21979 root 20 0 0 0 0 I 4.5 0.0 0:01.56 kworker/1:1-eve 22094 root 20 0 0 0 0 I 4.5 0.0 0:00.80 kworker/3:1-eve 22446 root 20 0 0 0 0 I 4.5 0.0 0:00.61 kworker/2:0-eve 27802 minimonk 20 0 45652 4232 3476 R 4.5 0.0 0:00.97 top |
[링크 : https://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch07_Thread]
+
pthread_join()으로 쓰레드가 끝나길 기다리는데 안 끝난다.
return이 없어서인가.. 쓰레드도 종료를 하는 다른 함수가 있는건가?
+
다시 해보니 pthread_join에 포인터로 pthread_t 변수를 넘겨서 그랬던 듯. 잘 돈다.
#include <stdio.h> #include <pthread.h>
void *func(int *val) { printf("hello %d\n", *val);
// return ((void*)0); }
void main() { pthread_t pt; int pid = 0; int i = 0; int status = 0; for(i = 0; i < 100000; i++) { pid = pthread_create(&pt, NULL, func, &i); if (pid > 0 ) { perror("thread create error"); exit(0); } pthread_join(pt, (void**)&status); } } |
[링크 : https://www.joinc.co.kr/w/Site/Thread/Advanced/ThreadCancle]
좀.. 비슷한 타입으로 하게 하라고 -_-
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); int pthread_join(pthread_t thread, void **retval); |
+
pthread_join 안하니 다시 메모리 할당 오류. 쓰레드 에서 return 0 하는거랑은 상관없다.
#include <stdio.h> #include <pthread.h>
void *func(int *val) { printf("hello %d\n", *val);
// return ((void*)0); }
void main() { pthread_t pt; int pid = 0; int i = 0; int status = 0; for(i = 0; i < 100000; i++) { pid = pthread_create(&pt, NULL, func, &i); if (pid > 0 ) { perror("thread create error"); exit(0); } // pthread_join(pt, (void**)&status); } } |
detach 하면 종료시 자동으로 자원 반납이 된다고 한다.
테스트 해보니 return도 필요없이 쓰레드에서 실행될 함수가 종료되면 그냥 종료된다.
랜덤하게 안되긴 한데, printf가 중첩되서 버퍼가 쌓이며 문제가 생기는거 같기도 하고? (쓰레드를 5만개 넘기는 시점이니)
기본적으로 스레드의 종료 코드는 스레드가 종료되더라도 pthread_join이 호출될 때까지 유지됩니다. 하지만, detatch 상태의 스레드는 종료되는 즉시 자원이 회수됩니다 |
[링크 : http://xucxo.blogspot.com/2011/03/linux-programming-thread.html]