2013-03-14 1 views
1

파이널 라이저에서 관리되는 리소스를 정리해야하거나 클린업이 필요한 스레드 안전한 방식으로 어딘가에 기록해야한다고 가정합니다. 내가 이해하는 바에 따르면, 파이널 라이저에서 자물쇠를 가져가는 것은 엄격히 말하지만 연동 클래스는 어떨까요? 이것은 안전하며 교착 상태가 발생하지 않습니까?Interlocked를 Finalizer에서 사용할 수 있습니까?

static int deadentries; 
~Item() { Interlocked.Increment(ref deadentries); } 
public static T Get(int id, Action<T> init) { 
    T ret; 
    WeakReference<T> tref; 
    if (cache.TryGetValue(id, out tref)) { 
     if (tref.TryGetTarget(out ret)) return ret; 
     else Interlocked.Decrement(ref deadentries); 
    } 
    if (deadentries * 2 > cache.Count) { 
     // etc. etc. 

또한,이 보장 된 행동이나 단지 구현 세부이며, 모든 파이 나라가 하나 개의 스레드에서 실행되는 것 같다? 그리고 세부 사항이라면 자물쇠가 결코 다른 곳으로 옮겨지지 않는다면 finalizers 내부의 자물쇠를 획득하는 것이 좋습니다 (예 : 자물쇠가없는 대기열에서 작업을 푸시).

답변

1

finalizer가 하나의 스레드로 실행되는 것은 구현 세부 사항입니다 (MS가 유지하는 매우 엄격한 호환성 표준을 위반하기 때문에 변경되지 않을 것입니다.).

잠금 장치는 실제로 종결 자에서 정상입니다. 성능이나 정확성 문제가 될 수 있지만 Finalizer의 일부로 실행되는 것은 아닙니다. 그것들은 자물쇠의 일반적인 속성입니다. Interlocked 클래스도 사용할 수 있습니다.

Finalizer는 순서에 관계없이 동시에 실행할 수 있습니다. 또한 inverse-dependency-order가 아니라 임의 순서로 존재합니다.

관련 문제