2011-12-26 74 views
3

尝试使用pthread_create产生线程时,我得到了EAGAIN。但是,从我所检查的内容来看,这些线程似乎已被正确终止。pthread_create和EAGAIN

当尝试使用pthread_create创建线程时,什么决定OS给EAGAIN?是否有可能未封闭的套接字/文件句柄在引起这个EAGAIN(即它们共享相同的资源空间)方面发挥作用?

最后,是否有任何工具来检查资源使用情况,或者可以使用任何函数来查看当时有多少个pthread对象处于活动状态?

回答

7

好的,找到答案。即使调用pthread_exit或pthread_cancel,父进程仍然需要调用pthread_join来释放pthread ID,然后该pthread ID将变为可循环使用。

最后放置一个pthread_join(tid,NULL)的技巧。

编辑(没有waitpid函数,而是在pthread_join)

+5

如果你对等待线程不感兴趣,就释放资源而言,'pthread_detach()'应该做同样的事情。 – 2012-01-03 00:50:36

3

实际情况EAGAIN几乎总是与流程内存不足有关。这通常与分配给线程的堆栈大小有关,您可以使用pthread_attr_setstacksize()进行调整。但是可以运行多少个线程的进程是有限制的。您可以使用RLIMIT_NPROC作为第一个参数,使用getrlimit()查询硬限制和软限制。

这里有很多问题都是为了跟踪线索,他们的人数,他们是死还是活,等等。简单地说,跟踪他们的最简单方法就是通过一些机制代码,可以像增加和减少全局计数器(受互斥锁保护)或更精细的操作一样简单。

打开的套接字或其他文件描述符不应导致pthread_create()失败。如果您在创建新线程之前达到了描述符的最大值,那么在创建新线程之前已经失败了,并且新线程必须已经成功创建才能打开其中的更多线程,从而无法使用EAGAIN失败。

1

按我的观察,如果父进程的一个调用在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); 
} 
0

另一个潜在原因:我得到这个问题(EAGAINpthread_create),因为我忘了呼吁pthread_attr_tpthread_attr_init我试图初始化我的线程有。