LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (http://www.linuxquestions.org/questions/programming-9/)
-   -   Problem with huge number of pthreads (http://www.linuxquestions.org/questions/programming-9/problem-with-huge-number-of-pthreads-126531/)

Berng 12-17-2003 12:33 AM

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.

ToniT 12-17-2003 02:56 AM

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).

Kumar 12-17-2003 05:05 AM

Have you cleaned up the thread properly?

Berng 12-17-2003 05:34 AM

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)

Kumar 12-17-2003 06:20 AM

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).

Berng 12-17-2003 06:51 AM

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.

Kumar 12-17-2003 07:17 AM

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.

Berng 12-17-2003 07:33 AM

Kumar, Thanks a lot


All times are GMT -5. The time now is 05:47 AM.