2011-12-23 23 views
3

私は多くのスレッドを実行するアプリを持っています。マルチスレッドアプリケーションでの私の最初の試みであり、スレッドプールを使用せず、自分のスレッドを生成するだけです。それらが実行するメソッドは無期限にループします。これは問題を引き起こしますか?私が尋ねる理由は、私のアプリが約10分間正常に動作しているように見えてから、ほぼ完全に停止するということです。任意のヒントをいただきました。乾杯。連続ループが原因でスレッドの問題が発生する可能性がありますか?

編集:ちょっとした情報を追加します。アプリはアカウント作成者です。 100以上のスレッドを常に実行できるようにしたいと思います。スレッドは停止せずに実行され、常に作成されるのではなく、一度だけ作成され、プログラムを終了するまでアカウントを作成する必要があります。

答えて

2

このthreading in C#は非常に慎重に読んでください。これは、利用可能なスレッドリソースのうちの1つです。 CPUリソースを浪費するため、プロセッサーの回転はお勧めしません。スレッドを処理する必要がない場合はスレッドをブロックし、信号に対処する必要がある場合は起動する方が良いです。

0

あなたは.NET 4.0を使用している場合は、タスク並列ライブラリを使用して見てください。これはすべきで、(スレッドがなどプーリング)

http://msdn.microsoft.com/en-us/library/dd460717.aspx

MSは、ここで多くのハードワークを行っています一般的なスレッディングの問題を回避するのに役立ちます。

あなたの問題では、何かをロックしていないことを確認してから、ループのロックをいつもどこかで削除していないのでしょうか?

+0

私のロックはすべてうまくいます。最後のテストでは、私のアプリは、それがうまくいかないうちに20スレッドを実行して、このメソッドを7000回実行しました。私はそのリンクを見てみましょう。 – xxf8xx

0

技術的に無期限にループしても問題は発生しませんが、ほとんどの場合、最良の設計方法ではありません。あなたのアプローチでは、メモリリークが発生しておらず、オブジェクトが正しく処分されていることを保証する必要があります。

0

はい、バインドなしでスレッドを作成すると、多くの問題が発生する可能性があります。

  1. OSによって効率的にスケジュールされ、CPUによって実行されるスレッドの数には制限があります。 CPUバウンド操作では、スレッド数をCPUコアの数に近づけることが大切です。
  2. スレッドを連続的に作成して破棄すると、特に短命の操作では、多くの不必要なオーバーヘッドが発生します。スレッドプールは、これらのコストを削減する最善の方法です。
  3. スレッドが多すぎると、最終的にスタック領域が不足し、プログラムがクラッシュするだけです。その時点までにも、システムリソースが多すぎることになり、コンピュータ上の他のタスクが遅くなる可能性があります。
0

ループとループがあります。多くのスレッドは、アプリケーションの寿命のために無期限にループするように設計されています。他のポスターで説明されているように、スピンウェイトだけを行うCPUループは不要で無駄です。有用な作業をしているループと、ブロッキング呼び出しを含むループ。 I/Oまたはプロデューサ - コンシューマキューでは、アプリ全体の実行に任せることができます。

他のポスターと同じように、プールなどを見てください。連続的な作成/終了/破棄スレッドは高価でエラーが発生しやすいです。

+0

私は自分のアプリについてのさらなる情報で質問を更新しました。私は継続的にスレッドを作成せず、それらを破棄していません。私はそれらを作成してから、アプリケーションを閉じるまで実行させています。 – xxf8xx

関連する問題