这个问题似乎被问了很多次。我有一些看起来还不错的遗留生产代码,直到它开始每天处理更多的连接。每个连接都会启动一个新线程。最终,它将耗尽内存并崩溃。
我正在回顾我多年没有接触过的pthread(和C套接字)。我学习的教程很有用,但是当我使用top时也看到了同样的情况。所有线程都退出了,但仍然占用了一些虚拟内存。Valgrind告诉我在调用pthread_create()时可能会有内存泄漏。以下是非常基本的示例代码。
最可怕的部分是,当所有线程退出时,pthread_exit(NULL)似乎会留下约100m的VIRT未计算。如果我注释掉这行,它就更容易处理,但仍然存在一些问题。在我的系统上,它从大约14k开始,以47k结束。
如果我将线程数增加到10,000,则VIRT会增加到70多GB,但是假设我注释掉pthread_exit(NULL),则会在50k左右结束。如果我使用pthread_exit(NULL),则最终仍然有约113m的VIRT。这些是否可以接受?top是否没有告诉我全部信息?
我正在回顾我多年没有接触过的pthread(和C套接字)。我学习的教程很有用,但是当我使用top时也看到了同样的情况。所有线程都退出了,但仍然占用了一些虚拟内存。Valgrind告诉我在调用pthread_create()时可能会有内存泄漏。以下是非常基本的示例代码。
最可怕的部分是,当所有线程退出时,pthread_exit(NULL)似乎会留下约100m的VIRT未计算。如果我注释掉这行,它就更容易处理,但仍然存在一些问题。在我的系统上,它从大约14k开始,以47k结束。
如果我将线程数增加到10,000,则VIRT会增加到70多GB,但是假设我注释掉pthread_exit(NULL),则会在50k左右结束。如果我使用pthread_exit(NULL),则最终仍然有约113m的VIRT。这些是否可以接受?top是否没有告诉我全部信息?
void* run_thread( void* id )
{
int thread_id = *(int*)id;
int count = 0;
while ( count < 10 ) {
sleep( 1 );
printf( "Thread %d at count %d\n", thread_id, count++ );
}
pthread_exit( NULL );
return 0;
}
int main( int argc, char* argv[] )
{
sleep( 5 );
int thread_count = 0;
while( thread_count < 10 ) {
pthread_t my_thread;
if ( pthread_create( &my_thread, NULL, run_thread, (void*)&thread_count ) < 0 ) {
perror( "Error making thread...\n" );
return 1;
}
pthread_detach( my_thread );
thread_count++;
sleep( 1 );
}
pthread_exit( 0 ); // added as per request
return 0;
}
main()
中的return 0
之前添加pthread_exit(0)
? - jxhthread_exit()
函数调用可以解决这个问题。 - jxh