2011-10-20 2 views
3

내가 그러나 나는 다음과 같은 샘플을 이해하는 몇 가지 문제가 발생, 제약 실행 영역을 이해하기위한 시도 Constrained Execution Regions and other errata [Brian Grunkemeyer]을 통해 읽고 있어요에 탄소 배출권의 목적을 이해 :이 예

RuntimeHelpers.PrepareConstrainedRegions(); 
try { 
    // Prepare my backout code 
    MethodInfo m = _list.GetType().GetMethod("RemoveAt", new Type[] { typeof(int) }); 
    RuntimeHelpers.PrepareMethod(m.MethodHandle); 

    IEnumerator en = c.GetEnumerator(); 
    while(en.MoveNext()) { 
     _list.Insert(index++, en.Current); 
     // Assuming that these lines aren't reordered. 
     numAdded++; 
    } 
    _version++; 
} 
catch(Exception) { 
    // Reliable backout code 
    while(numAdded > 0) { 
     _list.RemoveAt(index--); 
     numAdded--; 
    } 
    throw; 
} 

나의 이해는 것입니다을 try 블록이 이 아니고이 제한되면 finally 및 catch 블록만이 제한됩니다. 즉, try 블록 중에 언제든지 비동기 예외 (예 : ThreadAbortException)가 throw 될 수 있습니다. 특히 numAdded++ 앞에 있지만 _list.Insert 이후에 throw 될 수 있습니다. 이 경우 백 아웃 코드는 _list에서 너무 적은 항목 하나를 제거합니다.

이 예제에서 나는이 예제에서 제한된 실행 영역의 목적을 이해하는 데 어려움을 겪고 있습니다.

이 부분에 대한 올바른 이해가 있습니까? 아니면 놓친 부분이 있습니까?

+0

여기에는 문제가있는 것처럼 보입니다. –

답변

1

CER의 문서화 및 실제 동작은 내가 관찰 한 내용을 기반으로 정확하게 일치하지 않습니다. ThreadAbortExceptionInsertnumAdded++ 사이에 주입되는 위치를 설명하는 문제는 테스트 한 .NET Framework 버전에서는 불가능합니다. 이 경우 두 가지가 있습니다. 이유는입니다.

  • PrepareConstrainedRegions이 문서의 말씀에도 불구하고, 수행의 try 블록에 관찰 할 수있는 효과가 있습니다. 그것은 특정 중단 주사를 지연시킬 것입니다; 특히 쓰레드가 경고 상태에있는 동안 오지 않는 것들.
  • PrepareConstrainedRegions 호출이 없어도 중단은 여전히 ​​해당 위치에 주입되지 않습니다. SSCLI 코드를 기반으로 abort는 후진 점프에서 주입되어 while 루프를 회전시킵니다. 내 자신이 question here 관련 응답하고 Thread.Abort 실제로 here 작동 방법에 대한 질문에 대답하는 동안

나는 이것 좀 알아 냈어.

포인트 # 2는 (는) 합법적이지 않습니다. 공식 배포판으로 이전 할 수없는 SSCLI의 구현 세부 사항입니다 (실제로는 의심 스럽지만). 또한 실행 중 어떤 시점에서 중지가 발생할 가능성을 무시합니다 (Insert). 나는 Insert의 중요한 비트가 내부적으로 CER을 사용할 수 있다고 생각합니다.

포인트 # 1은 중요한 문제 일 수 있지만 Microsoft가 왜 문서화하지 않았으며 인용 한 기사에서 언급하지 않은 이유는 무엇입니까? 확실히이 기사의 저자는이 사실을 알고있었습니다. 그렇지 않으면, 나는 또한 제시된 코드가 어떻게 안전 할 수 있는지 이해하지 못하고있다. 다시 말해서 우연한 사고로만 안전합니다.

PrepareConstrainedRegions이 무엇을하고 있는지 추측해야한다면 JIT 엔진에 깃발을 세우면 뒤쪽 분기 점프에서 전략적으로 배치 된 GC 폴링 훅을 삽입하지 않는다고 알려줍니다. CER try 블록 안의 코드는 이 GC 폴링 훅은 일반적으로 (가비지 콜렉션과 관련된 주요 목적 외에도) 비동기 중단이 주입되는 곳입니다.