ここにあなたたちのためのパズルがあります。一部のスレッドがロックやセマフォなどの管理対象リソースを操作するマルチスレッド プログラムがあります。ロック解放プリミティブの一部は、ロックの取得が行われた同じスレッドからのみ実行できます。
だからここに私のパズルがあります: 私はこれらの種類の操作をラップします: try { lock-acquire... do something } finally { lock-release } しかし、スレッドが終了すると、finally 句が .NET ガベージ コレクション スレッドによって実行され、私のスレッドではありません。(特定のケースには、実際には「using」ステートメントで割り当てられたオブジェクトの Dispose が含まれます。詳細については、以下を参照してください)
これはデモが少し難しいです。私は Isis2 でいつもそれを目にします。私は、取得ブロックとファイナライズ ブロックのスレッド ID をチェックすることで、これが起こっていることを理解しました。しかし、3 行のデモはありません。申し訳ありません。私はそれが助けを提供しやすくすることを知っています.
そのスレッドに関連付けられているすべての保留中のファイナライズ ブロックが実行されるまで、スレッドの終了を遅らせる方法はありますか?
---- マークの詳細を追加 ----
私が実際に行っているのは、スレッドの優先度を備えたさまざまなロックの抽象化 (境界のあるバッファー、バリア、通常のロックなど) を持ち、デッドロック、優先度の逆転、非常に遅いロック付与を自己検出するように設計された、かなり精巧な自己計装ロック パッケージです。その他の問題。私のコードは十分に複雑で十分にスレッド化されているため、デバッグするにはこれが必要でした。
私の基本的な構成スタイルの例は次のとおりです。
LockObject myLock = new LockObject("AnIsis2Lock");
...
using(new LockAndElevate(myLock)) { stuff }
LockObject は自己監視ロックです... LockAndElevate は、ロックしたことを記録し (この場合)、ロックを解除したときに破棄を追跡します。したがって、例外がスローされたとしても、ブロックが完了すると新しいオブジェクトを破棄する必要があるという事実を利用しています。
私が見ているのは、かなり頻繁にスレッドが終了し、まだ使用中の破棄イベントが実際に発生していないことです。それらは後で別のスレッドで実行されます。これは、スレッドの 1 つが終了したときにのみ発生します。通常の実行では、すべてが魔法のように機能します。
したがって、変換を使用して試してから...最後に、私の質問はfinally句の観点から投稿されました。