- PR -

ThreadのPriorityについて

投稿者投稿内容
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-05-15 18:10
引用:

Thread.Startで起したThreadとBeginInvokeで起したThreadを両方使っていますが、このように交え使う場合、何か不都合が生じるでしょうか?


いえ、別に起こりませんよ。
デリゲートや Control の BeginInvoke はスレッドプールで管理されるという違いはありますが。

引用:
また、何れのタイプのThreadも実行している間に止まったような感じがするので、Thread自体止まる要因として何が考えられるでしょうか?


止まったような感じというのがどんなのか分からないので答えようがないです。
// 「ような感じ」ってことは実際には止まってないのか? とか。
もっと具体的に、どんな現象が発生しているのでしょうか。

引用:

例えば、ガベジコレクションが動作するとうまく行かないとか?


確かに GC の実行中は他のスレッドは一旦停止されますが、別にそれで不具合が発生するわけではありませんし。
これは新しくスレッドを立てているとかどうかとは無関係の話です。

ひょっとして高度なリアルタイム性を要求していますか?
Bob
常連さん
会議室デビュー日: 2006/03/23
投稿数: 31
投稿日時: 2006-05-15 19:49
ご返事ありがとうございます。

引用:

Hongliangさんの書き込み (2006-05-15 18:10) より:

止まったような感じというのがどんなのか分からないので答えようがないです。
// 「ような感じ」ってことは実際には止まってないのか? とか。
もっと具体的に、どんな現象が発生しているのでしょうか。


本当は止まっています。確認の仕方として、該当Threadは段階的にLogを吐くはずなので、処理の途中でLogが途絶えて、先に進まないことで「止まった」と判断したわけです。

引用:

これは新しくスレッドを立てているとかどうかとは無関係の話です。

ひょっとして高度なリアルタイム性を要求していますか?


そうですね。リアルタイムで、MuiltiThreadで動作しないといけませんので、通信のやり取りは全てThreadでEvent通知を行っています。

OSのThreadPool自体が不透明がところが多く、やむ得ない限り自作のThread管理を行っています。リアルタイム性が強いと、何か気になることがありますか?

以上、宜しくお願い致します。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-05-15 20:04
引用:

本当は止まっています。確認の仕方として、該当Threadは段階的にLogを吐くはずなので、処理の途中でLogが途絶えて、先に進まないことで「止まった」と判断したわけです。


途絶えて先に進まない、ってのはそこで処理が滞ると言うことなのか、それともスレッドが終わっちゃうのかどっちでしょう?
発生頻度は? どれくらいの時間? 複数のスレッドが同時に止まるのですか?

引用:

そうですね。リアルタイムで、MuiltiThreadで動作しないといけませんので、通信のやり取りは全てThreadでEvent通知を行っています。

OSのThreadPool自体が不透明がところが多く、やむ得ない限り自作のThread管理を行っています。リアルタイム性が強いと、何か気になることがありますか?


数ミリ秒を気にするようなリアルタイム性を Windows は持ってませんし、数十ミリ秒の間隔を取りこぼしたらいけないようなのは .NET Framework では実現不可能ですから。

ちなみに、 .NET の ThreadPool は OS(Windows) ではなく .NET Framework の実装です。
Bob
常連さん
会議室デビュー日: 2006/03/23
投稿数: 31
投稿日時: 2006-05-15 20:22
引用:

Hongliangさんの書き込み (2006-05-15 20:04) より:
引用:

本当は止まっています。確認の仕方として、該当Threadは段階的にLogを吐くはずなので、処理の途中でLogが途絶えて、先に進まないことで「止まった」と判断したわけです。


途絶えて先に進まない、ってのはそこで処理が滞ると言うことなのか、それともスレッドが終わっちゃうのかどっちでしょう?
発生頻度は? どれくらいの時間? 複数のスレッドが同時に止まるのですか?


Thread自体は終了しておらず、単に止まるということです。特に自分でThread.StartしたThreadのハンドラを保持しているので、強制的にAbortさせることが可能です。発生した場合1スレッドで、頻度は高くないが、タイミングがまだ掴んでおりません。
引用:

引用:

そうですね。リアルタイムで、MuiltiThreadで動作しないといけませんので、通信のやり取りは全てThreadでEvent通知を行っています。

OSのThreadPool自体が不透明がところが多く、やむ得ない限り自作のThread管理を行っています。リアルタイム性が強いと、何か気になることがありますか?


数ミリ秒を気にするようなリアルタイム性を Windows は持ってませんし、数十ミリ秒の間隔を取りこぼしたらいけないようなのは .NET Framework では実現不可能ですから。


確かに仰るとおりですが、こちらとしてイベントの紛失が無ければ、取り合えず何とかなります。因みに、XPのThreadにてEventを通知する際、紛失を顧慮してイベントの再送する仕組みが必要でしょうか?

引用:

ちなみに、 .NET の ThreadPool は OS(Windows) ではなく .NET Framework の実装です。


失礼しました。ご指摘ありがとうございます。
sia
常連さん
会議室デビュー日: 2004/05/02
投稿数: 38
投稿日時: 2006-05-15 23:35
こんばんは。

お話を聞く限りでは、デッドロックが起きているように聞こえます。
もしそうだとしたらですが、以下のような手順で簡単にデバッグできるかもしれません。
※VS2005前提です。

[準備]
各スレッドに名前を付ける。

[デバッグ]
1.デバッグ版を実行。(VSからではなく、直接起動)
2.問題となるスレッドの実行が停止したら、プロセスにアタッチでVSにデバッグプロセスをアタッチ
3.全て中断で全スレッドを停止。
4.デバッグウインドウのスレッドを表示
5.止まっているスレッドを「スレッド」ウインドウでクリックして、いろいろ調査。


的はずれでしたらごめんなさい。

[ メッセージ編集済み 編集者: sia 編集日時 2006-05-16 00:15 ]
Bob
常連さん
会議室デビュー日: 2006/03/23
投稿数: 31
投稿日時: 2006-05-16 20:15
引用:

siaさんの書き込み (2006-05-15 23:35) より:
[準備]
各スレッドに名前を付ける。

[デバッグ]
1.デバッグ版を実行。(VSからではなく、直接起動)
2.問題となるスレッドの実行が停止したら、プロセスにアタッチでVSにデバッグプロセスをアタッチ
3.全て中断で全スレッドを停止。
4.デバッグウインドウのスレッドを表示
5.止まっているスレッドを「スレッド」ウインドウでクリックして、いろいろ調査。




ありがとうございます。確かに仰るとおりですが、問題は発生頻度は一日に一回あるかないか位で、しかも発生した環境ではデバッガが使えないことです。

因みに、Thread.Start後はThreadが勝手に止まることがないと思いますが、どこかでLockが発生しない限り、最後まで必ず実行すると認識してもよろしいでしょうか?
sia
常連さん
会議室デビュー日: 2004/05/02
投稿数: 38
投稿日時: 2006-05-16 21:10
引用:

因みに、Thread.Start後はThreadが勝手に止まることがないと思いますが、どこかでLockが発生しない限り、最後まで必ず実行すると認識してもよろしいでしょうか?



基本的にはなんらかの原因で待ち状態にならない限り、停止はあり得ないと思います。

引用:

因みに、XPのThreadにてEventを通知する際、紛失を顧慮してイベントの再送する仕組みが必要でしょうか?


それと上記ですが、.Netのイベント(BeginInvokeで起こしたイベント?)
のことでしょうか?

引用:

1.デバッグ版を実行。(VSからではなく、直接起動)


・・・ちなみに、寝ぼけて変なこと書いていますが、VSからの直接起動で問題ないです。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-05-16 21:27
引用:

引用:

因みに、XPのThreadにてEventを通知する際、紛失を顧慮してイベントの再送する仕組みが必要でしょうか?


それと上記ですが、.Netのイベント(BeginInvokeで起こしたイベント?)
のことでしょうか?


これは私がちょっと筆を滑らせたのが原因です……。

引用:

数十ミリ秒の間隔を取りこぼしたらいけないようなのは


ってのは、イベント機構による通知ではなく、ポーリング的に状況を監視するような状況を指しています。COM ポートの受信とかそういうの。


ところで、止まるってのはどれぐらいの間止まってるんでしょうか。もうその後動かないと見て良いぐらい? 数秒?
話の流れとしては前者っぽいですが。
スレッドの内部での処理も気になります。外部コンポーネントを使っているとか、COM を触ってるとか。
止まる位置のコードの特定はできているんでしょうか? 不特定の位置で止まる?

スキルアップ/キャリアアップ(JOB@IT)