2011-12-26 55 views
3

pthread_createを使ってスレッドを生成しようとしたときにEAGAINを取得しました。しかし、私がチェックしたことから、スレッドは正常に終了したようです。pthread_createとEAGAIN

pthread_createを使用してスレッドを作成しようとすると、EAGAINに与えるOSを決定する要因は何ですか?クローズされていないソケット/ファイルハンドルがこのEAGAINの原因となっている(つまり、同じリソーススペースを共有している)可能性はありますか?

最後に、リソースの使用状況をチェックするツール、またはその時点でいくつのpthreadオブジェクトがアクティブであるかを確認するために使用できる関数はありますか?

答えて

7

さて、答えを見つけました。 pthread_exitまたはpthread_cancelが呼び出されたとしても、親プロセスはpthread_joinを呼び出してpthread IDを解放する必要がありますが、これはリサイクル可能になります。

pthread_join(tid、NULL)を最後に置くと、このトリックが実行されました。

編集(waitpidのではなく、pthread_joinをされなかった)親プロセスの一つがでpthread_join()を呼び出した場合、私の観察を1として

+5

スレッドを待つことに興味がないなら、 'pthread_detach()'はリソースを解放することに関して同じことを行うべきです。 –

3

実際問題として、EAGAINはほとんどの場合、プロセスのメモリ不足に関連しています。しばしば、これは、pthread_attr_setstacksize()で調整できるスレッドに割り当てられたスタックサイズと関係します。しかし、実行できるスレッドの数にはプロセス制限があります。 RLIMIT_NPROCを最初のパラメータとして使用して、ハードおよびソフト制限を照会することができます。getrlimit()

スレッドやその番号、スレッドが死んでいるかどうかなどを把握することに専念している質問がたくさんあります。簡単に言えば、それらを追跡する最も簡単な方法は、グローバルカウンタ(mutexで保護されている)をインクリメント/デクリメントするなどの単純な処理が可能なコードや、もっと複雑なものがあります。

オープンソケットまたはその他のファイル記述子では、pthread_create()が失敗してはなりません。ディスクリプタの最大値に達した場合は、新しいスレッドを作成する前にすでに失敗している可能性があります。新しいスレッドを作成するには、既にそれらのスレッドを作成する必要があり、EAGAINで失敗しませんでした。

1

、および冷却プロセスがpthread_exitを呼び出してスレッドを解放しようとしている()またはpthread_cancel()システムはそのスレッドを適切に解放できません。その場合、pthread_detach()がpthread_create()の呼び出しが成功した直後に呼び出された場合、この問題は解決されています。スナップショットはここにある -

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

別の潜在的な原因:私は私は私のスレッドを初期化しようとしていたpthread_attr_tpthread_attr_initを呼び出すために忘れていたので、私はこの問題(pthread_createEAGAIN)になっていました。

関連する問題