7

我在第一次尝试 C 中的线程时遇到了一些麻烦。我正在尝试(现在)编写一个非常简单的服务器程序,该程序接受套接字连接并启动一个新线程来处理它。它似乎工作正常,只是它只会在 pthread_create() 使用 EAGAIN 代码失败之前创建大约 300 个线程(303,有时是 304),这意味着:

“系统缺乏创建另一个线程所需的资源,否则将超过系统对进程 {PTHREAD_THREADS_MAX} 中的线程总数施加的限制。”

不是同时303 个线程 - 每个线程都退出,这是由 gdb 确认的。每次调用进程请求函数时,都会有两个线程在运行。

所以这意味着“系统缺乏必要的资源”。我的问题是(可能有点愚蠢)——这些资源是什么?大概这是我的程序中的内存泄漏(当然可能,甚至可能),但我认为即便如此,考虑到程序的其余部分几乎没有什么,它也可以管理超过 300 个。

如何找出我的程序有多少内存可用以确认它已用完?有足够的内存和免费交换,所以大概是操作系统(Linux)施加的人为限制。

谢谢

4

2 回答 2

11

如果您没有使用该属性创建线程PTHREAD_CREATE_DETACHED(或使用 分离它们pthread_detach(),您可能需要pthread_join()在每个创建的线程退出后调用它以释放与其关联的资源。

于 2009-03-08T02:16:04.793 回答
0

可能有点矫枉过正(?),但Valgrind可以帮助您在 Linux 中定位 memleaks。

您能否发布一些代码片段?最好是分配/释放内存/套接字以及创建线程的部分。

于 2009-03-08T02:14:11.693 回答