嘗試使用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