クラスがありMyClass
ます。このクラスにはフィールドがあります:(public ReaderWriterLockSlim rw;
より簡単なサンプルコードの場合はpublic)。多くのスレッドは、など MyClass
を使用してデータを読み取ることができます。rw.EnterReadLock
IDisposable
また、私はインターフェース を実装しました:
private void Dispose (bool pDisposing)
{
{
if (pDisposing) // release managed resources
{
if (rw != null)
{
rwLockSlim.Dispose ();
rwLockSlim = null;
}
}
//--- release unmanaged resources
// some code...
isDisposed = true; // ...
}
}
ご覧のとおり、問題は、myClassオブジェクトでMyClass
2番目のスレッドが呼び出されたときに1つのスレッドが使用されている場合です。Dispose
ReaderWriterLockSlimを破棄すると、アプリケーションがクラッシュするため、破棄できません。では、管理対象リソースを解放する行を削除する必要がありますか?とにかく、ReaderWriterLockSlimは近い将来GCによって収集されますよね?(しかし、このクラスのリソースは高価ですか?)
たぶん、Dispose metodなどにlock(syncObject)を追加する必要がありますか?
編集:AllocHGlobalも扱っているので、すべてのスレッドがへの読み取り/書き込みを停止するまで待つ必要がありmyClass
ます。
別の視点:
public MyClass : IDisposable
{
public void EnterReadLock (); // calls rwLockSlim.EnterReadLock,
// if object is disposed throws Exception
public void ExitReadLock (); // same as above
public void Dispose (); // wait until all threads exit from locks,
// frees unamanged resources, mark class as disposed
}