我的应用内存使用率正在增长,使用pthread

时间:2010-06-23 00:09:49

标签: c linux multithreading pthreads

我使用C语言和Linux作为我的编程平台。

在我的用户空间应用程序中。我用pthread创建了一个线程。

int main()
{
   pthread_t thread1, thread2;
   pthread_create( &thread1, NULL, fthread1, NULL );
   pthread_create( &thread2, NULL, fthread2, NULL );

   return 0;
}

void *fthread1( void *ptr )
{
   /* do something here */
   pthread_exit( NULL );
}

void *fthread2( void *ptr )
{
   /* do something here */  
   pthread_exit( NULL );
}

我的问题是当我循环pthread_create再次创建两个线程时,我的应用程序内存使用量变得越来越大。

while( 1 )
{
   pthread_create( &thread1, NULL, fthread1, NULL);
   pthread_create( &thread2, NULL, fthread2, NULL);
}

我在VSZ列中使用Linux ps命令行工具确定内存消耗。

似乎我错过了一些使用pthreads API的部分。如何让我的应用程序不要使用太多内存。

3 个答案:

答案 0 :(得分:5)

当线程仍在运行/尚未启动时,您可能正在创建线程。这是未定义的行为。 (阅读:非常糟糕)

如果你修改你的程序:

while( 1 )
{
   pthread_create( &thread1, NULL, fthread1, NULL);
   pthread_create( &thread2, NULL, fthread2, NULL);
   pthread_join(&thread1, NULL);
   pthread_join(&thread2, NULL);
}

您将在开始新线程之前等待线程完成。

请注意,每个线程都有自己的调用堆栈和控制结构,并且会占用内存。最好限制应用程序中的线程数,不要以快速方式创建和销毁线程。

答案 1 :(得分:4)

在循环创建新线程之前,请确保现有线程已完成:

while( 1 )
{
   pthread_create( &thread1, NULL, fthread1, NULL);
   pthread_create( &thread2, NULL, fthread2, NULL);
   pthread_join(&thread1);
   pthread_join(&thread2);
}

您创建线程的速度比处理器清理线程的速度快。

答案 2 :(得分:0)

每个线程必须分离或连接。你没有分离你的线程,你没有创建它们分离,你没有加入它们。你的pthreads实现必须永远保持线程,因为它无法知道你从不打算加入它们。