- PR -

C#のLock処理について

投票結果総投票数:8
Windows 8 100.00%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
Bob
常連さん
会議室デビュー日: 2006/03/23
投稿数: 31
投稿日時: 2006-03-28 09:18
引用:

渋木宏明(ひどり)さんの書き込み (2006-03-27 23:11) より:
引用:

# 不思議だ。何で Dispose しなくていいんだろう?



マネージスレッドはマネージ資源だからでは?

# ↑だけ見て書いてるので、間違っていたらごめんなさい。




自分の認識だと、BeginInvokeで生成されThreadのハンドルはプロセス毎のThreadPoolにて管理され、決まったタイミングで開放されると思います。
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-03-28 22:00
たぶん、各スレッドのeventProcessへ到達する順序が
想定と異なる場合が発生しているからではないでしょうか?
スレッドの実行順序と到達順序は必ずしも一致しません。

提示されたコードを見るかぎり、
CancelとResultOfProcessXがほぼ同時に発生した場合、
ResultOfProcessXスレッドがeventProcessへ到達するより前に
Cancelスレッドが先に到達する可能性があります。
これはResultOfProcessXスレッドが先に実行されているかどうかは関係ありません。
ただ、状態遷移が正しく実装され実行順序(eventProcess内で)が保証されている場合は
成り立たないので、別に原因があるのかもしれません。


引用:

# 不思議だ。何で Dispose しなくていいんだろう?


現在の実装では
1つのマネージスレッドに対し1つのアンマネージスレッドが割り当てられていますが、
アンマネージスレッドは複数のマネージスレッドに属すことがあります。
これにより、あるマネージスレッドが終了したからといってアンマネージスレッドを
Disposeすることは出来ない(してはいけない)のではないでしょうか?


[ メッセージ編集済み 編集者: うにくま 編集日時 2006-03-28 22:34 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-29 22:45
引用:

渋木宏明(ひどり)さんの書き込み(2006-03-27 23:11)より:

マネージスレッドはマネージ資源だからでは?


引用:

うにくまさんの書き込み(2006-03-28 22:00)より:

1つのマネージスレッドに対し1つのアンマネージスレッドが割り当てられていますが、
アンマネージスレッドは複数のマネージスレッドに属すことがあります。


 UNIX でも Win32 でも「スレッド破棄」が必要だったことと、「あるものを使っているだろう(Win32 のラップ)」という発想しかなかった。。。


引用:

Bobさんの書き込み(2006-03-28 00:25)より:

ただ、一つ疑問になるのは、下記の例では異なるスレッドでlockFunc1()とlockFunc2()が呼ばれたら、お互いにロックすることが全くないと思います。そうすると、「ロックの対象となるオブジェクトが全く同じものではないとロックが機能しない」との認識は正しいでしょうか?


 はい、ロックされません。
 なちゃさんが「ここら辺の定義に 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)も、同じ事をおっしゃっているのだと思います。この辺の“順番”を、確認してください。


 あとは、設計とコーディングを図にして、確認してみてください。
Bob
常連さん
会議室デビュー日: 2006/03/23
投稿数: 31
投稿日時: 2006-04-07 17:21
皆様にたくさんご指摘を頂き、ありがとうございます。

今、Thread管理でThreadPoolではなく、自分で管理しようと考えていますが、各Threadのハンドルを一括管理する際、それぞれのThreadの終了を監視するには専用監視Threadを設ける以外、他にも良い方法がありますか?



[ メッセージ編集済み 編集者: Bob 編集日時 2006-04-07 17:21 ]

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