2009-03-08 9 views
6

私はCでのスレッドへの最初の挑戦でいくつかの問題を抱えています。ソケット接続を受け入れ、それを処理するための新しいスレッドを開始する非常に単純なサーバープログラムを書くことを試みています。これは、pthread_create()がEAGAINコードで失敗する前に、約300スレッド(303、時には304)しか作成されないことを除いて、正常に動作しているようです。pthread_create()は、2つのスレッドしかアクティブでないとなぜ失敗するのですか?

"システムに別のスレッドを作成するために必要なリソースがありません。プロセス{PTHREAD_THREADS_MAX}内のスレッドの総数に対するシステムの制限が超過します。

これは同時に012スレッドを終了します - 各スレッドはgdbによって確認されます。プロセス要求関数が呼び出されるたびに、2つのスレッドが実行されます。

これは、「システムに必要なリソースが不足している」という意味です。私の質問は(そしてそれは少し愚かかもしれない) - これらのリソースは何ですか?おそらくそれは私のプログラムのメモリリークだ(確かに可能であろうが、おそらく可能性もある)が、プログラムの残りの部分を考えると300以上を管理できると思っていただろう。

私のプログラムがメモリ不足であることを確認するために使用可能なメモリ量を確認する方法はありますか?十分なメモリとスワップがありますので、おそらくOS(Linux)によって人為的な制限が課されていると思われます。

おそらくおかげ

+0

あなたが投稿することができますスレッドを作成して破棄するコードスニペット? –

答えて

10

あなたは属性PTHREAD_CREATE_DETACHED(またはpthread_detach()でそれらを取り外すと、スレッドを作成していない場合、あなたはそれに関連付けられたリソースを解放するために出た後、各作成されたスレッド上でpthread_join()を呼び出す必要があります。

+0

Thankyou!ちょうどその属性を設定して、それは4000スレッドを超えていてカウントしています。 – Ray2k

0

少しやり過ぎ(?)が、Valgrindは、Linuxでmemleaksを見つけることができます。

コードスニペットを投稿することはできますか?スレッドを作成する場所とメモリ/ソケットを自由に割り当てる部分が好ましいでしょう。

関連する問題