Problem with huge number of pthreads
Good time of day!
The problem is the following: System: Intel, Linux RedHat 7.2, Kernel 2.4.19, gcc-3.3. The program works as a server. When new request comes, it creates a pthread. There can not be created 2 threads at the same time, in this case we just do not create new thread. Every called thread completes and exits, allowing next thread to be called. After a number of such calls (200,000 on my system) operational system does not allows to create a new thread et all, in any case returning EAGAIN error, so the system stops to work. In case i just create one infinite thread, wich makes corresponding tasks, and starting it using flags, this problem is never arrise. Could you please, explain me a possible source of this error, Best Regards, Oleg. |
Maybe the threads are not being deleted correctly afterwards. I can't know if you don't have a testcase to show. (that is, smallest possible code that is needed to reproduce the problem).
|
Have you cleaned up the thread properly?
|
2ToniT:
Here it is: #include <stdlib.h> #include <math.h> #include <unistd.h> #include <stdio.h> #include <pthread.h> pthread_attr_t *attr; pthread_t processor; int flag; void test(); main() { int pthread_res; long i; for(flag=0,i=0;i<(long)1000000; ) { if(flag==0) { usleep(100000); flag=1; i++; pthread_res=pthread_create(&processor, attr, (void*)&test,NULL); if(pthread_res) fprintf(stderr,"can not open thread:%d(%ld)\n",pthread_res,i),exit(1); } } } void test() { int i; usleep(100); fprintf(stdout,".");fflush(stdout); flag=0; pthread_exit(0); return; } Result: can not open thread:11(1023) |
How about adding pthread_join(processor, NULL); after pthread_res = pthread_create (&processor, attr, (void *) &test, NULL);
After making the changes, the program worked fine on my machine (RH 7.1, gcc 2.96). |
Kumar,
Thank you, looks like it works fine, but if you put this code before pthread_create, in other case it will stop the main program when pthread works :( But why this error arrise, is 0.1 second is not enough for finishing pthread? Thanks a lot, Oleg. |
Actually, by adding pthread_join(processor, NULL); you make sure that the main program waits for the child thread to terminate. So, it's like
1.main threads creates child thread 2.main thread waits for the child thread to terminate.(due to pthread_join) 3.when the child thread terminates, all the resources used my the child thread is freed. 4. go back to step 1. Hope this helps. |
Kumar, Thanks a lot
|
All times are GMT -5. The time now is 11:02 PM. |