- PR -

ThreadのPriorityについて

投稿者投稿内容
Bob
常連さん
会議室デビュー日: 2006/03/23
投稿数: 31
投稿日時: 2006-04-18 21:45
お世話になります。ThreadのPriorityについて質問させていただきます。

今Priorityが「Normal」のThread-AからThread-Bを生成し、Thread-BのPriorityを「Highest」に設定した上Thread-BをStartさせます。その後、AutoResetEventのWaitOne()にて待ち状態に入ります。
事情により、Thread-Bの処理中にAutoResetEventをSetすることになりますが、Thread-BのPriorityが高いので、ThreadーBが終了するまでにThread-Aが動き出さないと期待しているが、実はThread-Aはすぐに動き出してるみたい。

やはり、既にStartしたThreadに対してPriorityが関係ないのでしょうか?
それとも、他にも回避する方法がありますか?

以上、宜しくお願い致します。
sia
常連さん
会議室デビュー日: 2004/05/02
投稿数: 38
投稿日時: 2006-04-18 23:41
こんばんは。

プライオリティの使用(OS側の解釈)のされ方はOS依存です。
9x系とXPでは全く違った挙動をする可能性があります。

どのスレッドについて言及されているかがはっきりしないのですが、
(.Net?)のスレッドにいたってはCLR上で実装される論理スレッドなので、
OSのスレッドと一対一対応でさえないです。
その場合CLRの実装によってもまた変わります。

同期オブジェクトなどによる待ち合わせを行った方がよいと思われます。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2006-04-18 23:51
引用:
(.Net?)のスレッドにいたってはCLR上で実装される論理スレッドなので、
OSのスレッドと一対一対応でさえないです。


昔の Java VM によくあったグリーンスレッドみたいですね。動作プラットフォームが少ない CLR なら簡単にネイティブスレッド対応できるように思いますが・・・。そうなってないあたりも .NET アプリケーションが遅い原因のひとつなのかもしれませんね。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-04-19 00:06
引用:

未記入さんの書き込み (2006-04-18 23:51) より:
昔の Java VM によくあったグリーンスレッドみたいですね。動作プラットフォームが少ない CLR なら簡単にネイティブスレッド対応できるように思いますが・・・。そうなってないあたりも .NET アプリケーションが遅い原因のひとつなのかもしれませんね。


グリーンスレッドとはまたちょっと違うのでは?
OSのスレッドと一対一対応でさえないというのは、
マネージスレッドがOSのスレッドと固定的に
対応しているわけではないという意味だと思います。

まあ、仕様上はどんな実装でもありな気はしますし、
実際のとこどうなのかはぜんぜん詳しくないので分かりませんが…
sia
常連さん
会議室デビュー日: 2004/05/02
投稿数: 38
投稿日時: 2006-04-19 01:03
引用:

なちゃさんの書き込み (2006-04-19 00:06) より:
マネージスレッドがOSのスレッドと固定的に
対応しているわけではないという意味だと思います。



なちゃさんが仰っているような意味です。

OSのスレッドとCLRのスレッドが対応しているようないかなる
仮定もおくことは不適当であるという話が
http://www.microsoft.com/japan/msdn/net/books/debug
上記の本にあり、一対一対応を実装としては保証しないので、
その前提にたったようなコードはいけませんよ、というレベルの話です。

#実際問題、現時点では、一対一で対応していそうですが・・・。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-04-19 08:58
( ´_ゝ`)
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-04-19 12:29
引用:

Thread-BのPriorityが高いので、ThreadーBが終了するまでにThread-Aが動き出さないと期待しているが、



という期待を裏付ける規定はありません。

既にコメントがついているように、スレッドの同期処理は同期オブジェクトを使って実装しましょう。
Bob
常連さん
会議室デビュー日: 2006/03/23
投稿数: 31
投稿日時: 2006-05-15 17:54
お世話になっております。大分遅いレスになってしまいましたが、結局AutoResetEventにて、この問題を解決しました。いろいろ助言を頂き、ありがとうございます。

ところで、新たに問題が表れたのですが、Thread.Startで起したThreadとBeginInvokeで起したThreadを両方使っていますが、このように交え使う場合、何か不都合が生じるでしょうか?また、何れのタイプのThreadも実行している間に止まったような感じがするので、Thread自体止まる要因として何が考えられるでしょうか?例えば、ガベジコレクションが動作するとうまく行かないとか?

宜しくお願い致します。

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