- PR -

イベントのリソース解放について

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-02-18 22:14
作成されたイベントハンドルがCloseHandleでクローズされない場合、
内部的にどのようなことが起こるのでしょうか。

Q1.ケース1のように誤ってハンドルが書き換えられた場合、
その瞬間、ハンドルが指していたイベントのリソースはどうなりますか?
宙ぶらりんのままそれ以降も残留するという理解で正しいですか?

Q2.ケース2のように誤ってハンドルがスコープから外れた場合、
その瞬間、ハンドルが指していたイベントのリソースはどうなりますか?
(Q1と同様の質問)

Q3.ケース3のように誤ってCreateEventが二重に実行された場合、
その瞬間、最初のハンドルが指していたイベントのリソースはどうなりますか?
(Q1と同様の質問)

Q4.(Q1.Q2.Q3において)残留したリソースが解放されるのは最終的にいつの時点までですか?GCが解放してくれるのでしょうか?プロセスの完了時点ですか?ユーザーがログアウトする時点ですか?あるいはWindowsがシャットダウンされるまで残り続けるのですか?

Q5.ハンドルが失われてしまった状態において、宙ぶらりんになったリソースが残っているかをチェックし、必要であれば解放する手段はあるのでしょうか?

質問の背景
CreateEventのリソースはアンマネージでGCの対象外と理解していますが正しいでしょうか?リソースの振舞いを明確にしたくて質問しました。


// ***** 正しい方法でリソースが解放されるケース(本来の姿) ****
{
IntPtr hEvent = CreateEvent(IntPtr.Zero,false,false,"dummy");
...
CloseHandle(hEvent); // リソースの解放
hEvent = IntPtr.Zero; // 誤使用を避けるため初期化
}

// ***** ケース1 CloseHandleせずにhEventを書き換えてしまうケース *****
{
IntPtr hEvent = CreateEvent(IntPtr.Zero,false,false,"dummy");
hEvent = IntPtr.Zero;
...
}

// ***** ケース2 CloseHandleせずにhEventがスコープが外れるケース
{
IntPtr hEvent = CreateEvent(IntPtr.Zero,false,false,"dummy");
}

// ***** ケース3 hEventがCreateEventによって書き換えられてしまうケース *****
{
IntPtr hEvent = CreateEvent(IntPtr.Zero,false,false,"dummy1");
...
hEvent = CreateEvent(IntPtr.Zero,false,false,"dummy2");
...
}

コメント
一応C#を前提にしていますが、WIN32APIに依存した質問のような気もします。
そういった意味で.NETの会議室に相応しくない質問かも知れませんが...
大目に見てください。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-02-19 11:17
引用:

Q1.ケース1のように誤ってハンドルが書き換えられた場合、
その瞬間、ハンドルが指していたイベントのリソースはどうなりますか?
宙ぶらりんのままそれ以降も残留するという理解で正しいですか?



Yes.

引用:

Q2.ケース2のように誤ってハンドルがスコープから外れた場合、
その瞬間、ハンドルが指していたイベントのリソースはどうなりますか?
(Q1と同様の質問)



Q1 と同様です。

引用:

Q3.ケース3のように誤ってCreateEventが二重に実行された場合、
その瞬間、最初のハンドルが指していたイベントのリソースはどうなりますか?
(Q1と同様の質問)



Q1 と同様です。

引用:

Q4.(Q1.Q2.Q3において)残留したリソースが解放されるのは最終的にいつの時点までですか?



何の対策も行わなければ、当該プロセスからの参照はプロセス終了時に解放されます。

引用:

GCが解放してくれるのでしょうか?



してくれません。
GC から見た IntPtr は単なる数値でしかありません。

引用:

Q5.ハンドルが失われてしまった状態において、宙ぶらりんになったリソースが残っているかをチェックし、必要であれば解放する手段はあるのでしょうか?



一般的な方法はありません。

引用:

CreateEventのリソースはアンマネージでGCの対象外と理解していますが正しいでしょうか?



正しいです。
aetos
会議室デビュー日: 2005/01/27
投稿数: 16
投稿日時: 2007-02-19 12:29
引用:

渋木宏明(ひどり)さんの書き込み (2007-02-19 11:17) より:

引用:

Q4.(Q1.Q2.Q3において)残留したリソースが解放されるのは最終的にいつの時点までですか?



何の対策も行わなければ、当該プロセスからの参照はプロセス終了時に解放されます。

引用:

GCが解放してくれるのでしょうか?



してくれません。
GC から見た IntPtr は単なる数値でしかありません。




念のため補足しておくと、「当該プロセスからの参照が解放されること」と「イベントが消滅し、イベントリソースが解放されること」は別です。
イベントは複数のプロセスから参照でき、イベントリソースが解放されるのは、すべてのプロセスからの参照が解放された時です。

[ メッセージ編集済み 編集者: シャノン 編集日時 2007-02-19 12:29 ]
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-02-21 23:50
ご回答ありがとうございました。
疑問が明確になりました。
1

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