2011-01-12 10 views
1

ファイナライザメソッドでは、クリーンアップコードがスレッドセーフである必要がありますか?あるいは、GC自体は常に1つのスレッドで実行されていますか?.NET GC仕様と複数のスレッド

@Edit:クリア:ファイナライザがで実行されるスレッド問題ではない私は、ファイナライザだけ呼び出されます正確に1時間、すなわち、それだけで1つののスレッドになりますことを確認する必要があります。

+0

私は、後者は確かにそうではないが、前者の場合は面白いと伝えることができます... – Mehrdad

+1

これは、常に1つのスレッドで実行されるGCではありません。それは常に1つのスレッドで実行されるファイナライザです。 – Gabe

答えて

2

標準では、実行されるスレッドファイナライザについては何も指定していません。 §10.9から(自動メモリー管理):

「たとえば、C#は ファイナライザが実行されることを必要としないか、オブジェクトが とすぐに、彼らは資格、またはファイナライザは、任意の で実行されている あるとして収集すること特定の順序で、または任意の 特定のスレッドで発生します。

+0

それは私が思ったものですが、ロック/アンロックの必要性のために、重要なファイナライズコードを潜在的に劇的に遅くするものではありませんか? – Mehrdad

+0

実際の実装では、ファイナライザのために常に特定のスレッドを使用することがあります。しかし、あなたは故意に非常に柔軟な標準について尋ねました。 –

+0

GCがファイナライザを実行する方法から、本​​質的にスレッドセーフであることが期待されます。 GCスレッドがメインスレッドと異なることを期待する必要があることを意味します。しかし、ファイナライザは正確に1回だけ呼ばれます。私は単に好奇心が強く、確かめたいと思っていました。ありがとう! – user492238