2011-04-30 107 views
3

我正在开发一个处理客户端连接的应用程序。我为每个请求产生一个线程,因为会有短的任务。但是,在处理一定数量的连接后,我仍然遇到问题。具体而言,在381个连接之后,pthread_create无法创建新线程。我知道如果应用程序资源耗尽,或者已经创建了超过PTHREAD_THREADS_MAX个线程,这可能会失败。创建几个线程后Pthread_create失败

奇怪的是第一个381个线程在发生此错误时已经停止。我没有使用pthread_join来等待这些线程停止,我相信pthreads并不要求我以某种方式“停止”线程,如果我错了,请纠正我(至少manpage没有提到这一点)。我想也许这可能是当几个线程同时产生时产生的,然而,我已经多次测试过它,并且每次创建第382线程失败。

有谁知道会发生什么?任何帮助将不胜感激。

在此先感谢。

回答

4

如果你不叫pthread_join或分离线程(通过调用pthread_detach或使用属性分离状态创造它),由终止线程使用的资源将永远不会被释放。这是你的问题。如果您不需要加入您的话题,请在创建话题时立即将其分离。

+0

谢谢!我不知道这件事。我现在就试一试。 – mfontanini 2011-04-30 20:33:04

+0

好的,我已经达到了450多个pthread产生,所以我想这是问题所在。非常感谢! – mfontanini 2011-04-30 20:41:28

+3

请注意,默认情况下,glibc/NPTL为每个线程(通常为8-10MB)使用*非常大的堆栈大小,这就是381线程之后用完虚拟地址空间(32位)的原因。假设你不需要这么多,创建一个属性对象并使用'pthread_attr_setstacksize'来选择一个更小的堆栈大小(大多数用途中64k应该足够了)将会节省大量资源,并降低'pthread_create'失败的风险if许多线程仍在运行。然后你也可以预先设置detached属性,所以你不必调用'pthread_detach'。 – 2011-04-30 20:48:51