我第一次尝试使用C中的线程时遇到了一些麻烦。我正在尝试(现在)编写一个非常简单的服务器程序,它接受套接字连接并启动一个新线程来处理它。它似乎工作正常,除了在pthread_create()失败并且使用EAGAIN代码之前它只会创建大约300个线程(303,有时是304),这意味着:
“系统缺少创建另一个线程所需的资源,或者会超出系统对进程中线程总数的限制{PTHREAD_THREADS_MAX}。”
这是不 303个线程同时 - 每个线程退出,由gdb确认。每次调用进程请求函数时,都会运行两个线程。
所以这意味着“系统缺乏必要的资源”。我的问题是(而且可能有点愚蠢) - 这些资源是什么?据推测,这是我程序中的内存泄漏(当然可能,甚至可能),但我认为即使如此,考虑到程序的其余部分也很少,它可以管理超过300个。
如何确定我的程序有多少内存可用于确认它已用完?有足够的内存和交换免费,所以可能是操作系统(Linux)强加的人为限制。
由于
答案 0 :(得分:10)
如果您没有使用属性PTHREAD_CREATE_DETACHED
创建线程(或使用pthread_detach()
分隔它们,则可能需要在每个创建的线程退出后调用pthread_join()
以释放与之相关的资源。
答案 1 :(得分:0)
可能有点矫枉过正(?)但是Valgrind可以帮助你找到Linux中的memleaks。
您是否可以发布一些代码段?最好是分配/释放内存/套接字的部分以及创建线程的位置。