2011-12-26 76 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我試圖初始化我的線程有。