- - PR -
ThreadのPriorityについて
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-15 18:10
いえ、別に起こりませんよ。 デリゲートや Control の BeginInvoke はスレッドプールで管理されるという違いはありますが。
止まったような感じというのがどんなのか分からないので答えようがないです。 // 「ような感じ」ってことは実際には止まってないのか? とか。 もっと具体的に、どんな現象が発生しているのでしょうか。
確かに GC の実行中は他のスレッドは一旦停止されますが、別にそれで不具合が発生するわけではありませんし。 これは新しくスレッドを立てているとかどうかとは無関係の話です。 ひょっとして高度なリアルタイム性を要求していますか? | ||||||||||||||||||||
|
投稿日時: 2006-05-15 19:49
ご返事ありがとうございます。
本当は止まっています。確認の仕方として、該当Threadは段階的にLogを吐くはずなので、処理の途中でLogが途絶えて、先に進まないことで「止まった」と判断したわけです。
そうですね。リアルタイムで、MuiltiThreadで動作しないといけませんので、通信のやり取りは全てThreadでEvent通知を行っています。 OSのThreadPool自体が不透明がところが多く、やむ得ない限り自作のThread管理を行っています。リアルタイム性が強いと、何か気になることがありますか? 以上、宜しくお願い致します。 | ||||||||||||||||||||
|
投稿日時: 2006-05-15 20:04
途絶えて先に進まない、ってのはそこで処理が滞ると言うことなのか、それともスレッドが終わっちゃうのかどっちでしょう? 発生頻度は? どれくらいの時間? 複数のスレッドが同時に止まるのですか?
数ミリ秒を気にするようなリアルタイム性を Windows は持ってませんし、数十ミリ秒の間隔を取りこぼしたらいけないようなのは .NET Framework では実現不可能ですから。 ちなみに、 .NET の ThreadPool は OS(Windows) ではなく .NET Framework の実装です。 | ||||||||||||||||||||
|
投稿日時: 2006-05-15 20:22
Thread自体は終了しておらず、単に止まるということです。特に自分でThread.StartしたThreadのハンドラを保持しているので、強制的にAbortさせることが可能です。発生した場合1スレッドで、頻度は高くないが、タイミングがまだ掴んでおりません。
確かに仰るとおりですが、こちらとしてイベントの紛失が無ければ、取り合えず何とかなります。因みに、XPのThreadにてEventを通知する際、紛失を顧慮してイベントの再送する仕組みが必要でしょうか?
失礼しました。ご指摘ありがとうございます。 | ||||||||||||||||||||
|
投稿日時: 2006-05-15 23:35
こんばんは。
お話を聞く限りでは、デッドロックが起きているように聞こえます。 もしそうだとしたらですが、以下のような手順で簡単にデバッグできるかもしれません。 ※VS2005前提です。 [準備] 各スレッドに名前を付ける。 [デバッグ] 1.デバッグ版を実行。(VSからではなく、直接起動) 2.問題となるスレッドの実行が停止したら、プロセスにアタッチでVSにデバッグプロセスをアタッチ 3.全て中断で全スレッドを停止。 4.デバッグウインドウのスレッドを表示 5.止まっているスレッドを「スレッド」ウインドウでクリックして、いろいろ調査。 的はずれでしたらごめんなさい。 [ メッセージ編集済み 編集者: sia 編集日時 2006-05-16 00:15 ] | ||||||||||||||||||||
|
投稿日時: 2006-05-16 20:15
ありがとうございます。確かに仰るとおりですが、問題は発生頻度は一日に一回あるかないか位で、しかも発生した環境ではデバッガが使えないことです。 因みに、Thread.Start後はThreadが勝手に止まることがないと思いますが、どこかでLockが発生しない限り、最後まで必ず実行すると認識してもよろしいでしょうか? | ||||||||||||||||||||
|
投稿日時: 2006-05-16 21:10
基本的にはなんらかの原因で待ち状態にならない限り、停止はあり得ないと思います。
それと上記ですが、.Netのイベント(BeginInvokeで起こしたイベント?) のことでしょうか?
・・・ちなみに、寝ぼけて変なこと書いていますが、VSからの直接起動で問題ないです。 | ||||||||||||||||||||
|
投稿日時: 2006-05-16 21:27
これは私がちょっと筆を滑らせたのが原因です……。
ってのは、イベント機構による通知ではなく、ポーリング的に状況を監視するような状況を指しています。COM ポートの受信とかそういうの。 ところで、止まるってのはどれぐらいの間止まってるんでしょうか。もうその後動かないと見て良いぐらい? 数秒? 話の流れとしては前者っぽいですが。 スレッドの内部での処理も気になります。外部コンポーネントを使っているとか、COM を触ってるとか。 止まる位置のコードの特定はできているんでしょうか? 不特定の位置で止まる? |