尝试使用pthread_create产生线程时,我得到了EAGAIN。但是,从我所检查的内容来看,这些线程似乎已被正确终止。pthread_create和EAGAIN
当尝试使用pthread_create创建线程时,什么决定OS给EAGAIN?是否有可能未封闭的套接字/文件句柄在引起这个EAGAIN(即它们共享相同的资源空间)方面发挥作用?
最后,是否有任何工具来检查资源使用情况,或者可以使用任何函数来查看当时有多少个pthread对象处于活动状态?
尝试使用pthread_create产生线程时,我得到了EAGAIN。但是,从我所检查的内容来看,这些线程似乎已被正确终止。pthread_create和EAGAIN
当尝试使用pthread_create创建线程时,什么决定OS给EAGAIN?是否有可能未封闭的套接字/文件句柄在引起这个EAGAIN(即它们共享相同的资源空间)方面发挥作用?
最后,是否有任何工具来检查资源使用情况,或者可以使用任何函数来查看当时有多少个pthread对象处于活动状态?
好的,找到答案。即使调用pthread_exit或pthread_cancel,父进程仍然需要调用pthread_join来释放pthread ID,然后该pthread ID将变为可循环使用。
最后放置一个pthread_join(tid,NULL)的技巧。
编辑(没有waitpid函数,而是在pthread_join)
实际情况EAGAIN几乎总是与流程内存不足有关。这通常与分配给线程的堆栈大小有关,您可以使用pthread_attr_setstacksize()
进行调整。但是可以运行多少个线程的进程是有限制的。您可以使用RLIMIT_NPROC作为第一个参数,使用getrlimit()
查询硬限制和软限制。
这里有很多问题都是为了跟踪线索,他们的人数,他们是死还是活,等等。简单地说,跟踪他们的最简单方法就是通过一些机制代码,可以像增加和减少全局计数器(受互斥锁保护)或更精细的操作一样简单。
打开的套接字或其他文件描述符不应导致pthread_create()
失败。如果您在创建新线程之前达到了描述符的最大值,那么在创建新线程之前已经失败了,并且新线程必须已经成功创建才能打开其中的更多线程,从而无法使用EAGAIN失败。
按我的观察,如果父进程的一个调用在pthread_join()和冷冻过程正试图通过调用pthread_exit释放线程()或pthread_cancel()则系统无法正确释放该线程。在这种情况下,如果成功调用pthread_create()后立即调用pthread_detach(),则此问题已解决。快照是在这里 -
err = pthread_create(&(receiveThread), NULL, &receiver, temp);
if (err != 0)
{
MyPrintf("\nCan't create thread Reason : %s\n ",(err==EAGAIN)?"EAGAUIN":(err==EINVAL)?"EINVAL":(err==EPERM)?"EPERM":"UNKNOWN");
free(temp);
}
else
{
threadnumber++;
MyPrintf("Count: %d Thread ID: %u\n",threadnumber,receiveThread);
pthread_detach(receiveThread);
}
另一个潜在原因:我得到这个问题(EAGAIN
上pthread_create
),因为我忘了呼吁pthread_attr_t
pthread_attr_init
我试图初始化我的线程有。
如果你对等待线程不感兴趣,就释放资源而言,'pthread_detach()'应该做同样的事情。 – 2012-01-03 00:50:36