- - PR -
C#のLock処理について
«前のページへ
1|2|3|4
投票結果総投票数:8 | |||
---|---|---|---|
Windows | 8票 | 100.00% | |
|
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-28 09:18
自分の認識だと、BeginInvokeで生成されThreadのハンドルはプロセス毎のThreadPoolにて管理され、決まったタイミングで開放されると思います。 | ||||||||||||
|
投稿日時: 2006-03-28 22:00
たぶん、各スレッドのeventProcessへ到達する順序が
想定と異なる場合が発生しているからではないでしょうか? スレッドの実行順序と到達順序は必ずしも一致しません。 提示されたコードを見るかぎり、 CancelとResultOfProcessXがほぼ同時に発生した場合、 ResultOfProcessXスレッドがeventProcessへ到達するより前に Cancelスレッドが先に到達する可能性があります。 これはResultOfProcessXスレッドが先に実行されているかどうかは関係ありません。 ただ、状態遷移が正しく実装され実行順序(eventProcess内で)が保証されている場合は 成り立たないので、別に原因があるのかもしれません。
現在の実装では 1つのマネージスレッドに対し1つのアンマネージスレッドが割り当てられていますが、 アンマネージスレッドは複数のマネージスレッドに属すことがあります。 これにより、あるマネージスレッドが終了したからといってアンマネージスレッドを Disposeすることは出来ない(してはいけない)のではないでしょうか? [ メッセージ編集済み 編集者: うにくま 編集日時 2006-03-28 22:34 ] | ||||||||||||
|
投稿日時: 2006-03-29 22:45
UNIX でも Win32 でも「スレッド破棄」が必要だったことと、「あるものを使っているだろう(Win32 のラップ)」という発想しかなかった。。。
はい、ロックされません。 なちゃさんが「ここら辺の定義に volatile つけてみたり。」(2006-03-23 19:19)とおっしゃっていますが、このキーワードについて、調べましたか? また、「さらに、EventHandleClass は ParentClass の動的な変数なんだから」(2006-03-23 22:09)「false になるのは最初だけで,以降 true にしかならないのならば,排他する必要はあるのでしょうか.」(囚人さん 2006-03-24 02:33)の辺りも重要なのですが、理解いただけましたでしょうか。 うにくまさんのご指摘「スレッドの実行順序と到達順序は必ずしも一致しません。」(2006-03-28 22:00)、私の「おそらく、ブロックされているスレッドが解除される順番は、期待できないと思います」(2006-03-27 22:23)も重要です。一郎さんの「ちゃんと"A:true B:true"ってログに書かれます?」(2006-03-23 11:57)も、同じ事をおっしゃっているのだと思います。この辺の“順番”を、確認してください。 あとは、設計とコーディングを図にして、確認してみてください。 | ||||||||||||
|
投稿日時: 2006-04-07 17:21
皆様にたくさんご指摘を頂き、ありがとうございます。
今、Thread管理でThreadPoolではなく、自分で管理しようと考えていますが、各Threadのハンドルを一括管理する際、それぞれのThreadの終了を監視するには専用監視Threadを設ける以外、他にも良い方法がありますか? [ メッセージ編集済み 編集者: Bob 編集日時 2006-04-07 17:21 ] |
«前のページへ
1|2|3|4