나는 MyClass
클래스를 가지고 있습니다. 이 클래스는 필드가 있습니다 : public ReaderWriterLockSlim rw;
(더 쉬운 예제 코드는 공개). 많은 스레드 등 rw.EnterReadLock
IDisposable 및 ReaderWriterLockSlim
또한 내가 구현 한 IDisposable
인터페이스를 사용하여 MyClass
에서 데이터를 읽을 수 있습니다 : 하나 개의 스레드가 MyClass
를 사용하는 경우
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가 개체에 대한 두 번째 스레드 호출 Dispose
. ReaderWriterLockSlim은 응용 프로그램을 손상시킬 수 있으므로 처리 할 수 없습니다. 따라서 관리되는 리소스를 해제하는 행을 제거해야합니까? 어쨌든 ReaderWriterLockSlim은 가까운 장래에 GC에 의해 수집 될 것입니다. 맞습니까? (하지만이 클래스 리소스는 값 비싼가요?).
어쩌면 Dispose metod 또는 lock에 lock (syncObject)을 추가해야합니까?
EDIT : 또한 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
}
공개 ReaderWriterLockSlim은 예를 들어 목적으로 만 사용되었습니다. 두 번째 예제에서 보았 듯이 rwLockSlim.EnterReadLock()을 호출하는 EnterReadLock() 메서드를 만들었습니다. 어쨌든 귀하의 답변에있는 모든 제안에 감사드립니다. – zgnilec
나는 또한 이와 같은 구조를 피하려고 노력할 것이다.당신이 여러 스레드에서 MyClass 클래스의 단일 인스턴스를 사용하는 것처럼 보일 수 있습니다. 괜찮습니다. 하지만 그렇게한다면 메소드를 쓰레드 안전하게 만들고'EnterReadLock'과'ExitReadLock'을 적절히 실행하는 다른 코드에 의존하지 마십시오. – Dirk
'Dispose'를 호출하기 전에 스레드가 끝날 때까지 기다려야하는 경우도 있지만, 통신과 같은 일부 차단 API가있는 경우가 있습니다. 여기서 Dispose는 객체에 대해 호출 될 수있는 * 유일한 * 메소드입니다. (장치가 재구성 될 때까지 사용할 수없는 상태로 장치를 두지 않고 장치를 취소 할 수있는 방법이 없습니다). 이 패턴에서, busy 상태 인 객체에 대해 Dispose를 호출하면 진행중인 작업이 예외를 throw해야합니다. – supercat