2009-11-13 2 views
3
  • C# specification에서 우리는 참조 읽기/쓰기가 원 자성임을 알고 있습니다. 객체의 멤버에 액세스하는 명령문에서 참조에도 원자 적으로 액세스 할 수 있습니까? 필자는 컴파일러가 코드를 생성하는 동안 원 자성을 제공해야하는 암시 적 참조 읽기 종류이기 때문에 예라고 생각합니다.개체 구성원 및 원 자성에 액세스

  • 같은 성명에서 멤버에 액세스하기 위해 개체에 액세스하면 이로 인해 개체 참조가 유지되므로 다른 스레드에서 새 인스턴스를 만들 때 가비지 수집되지 않습니다?

  • 그래서 체인의 멤버에 액세스하면 가장 왼쪽의 객체 참조도 유지되어 다른 스레드에서 가비지 수집되지 않습니까?

다음 코드를 고려하십시오.

static SomeClass sharedVar; 

void someMethod() 
{ 
    SomeClass someLocalVar = sharedVar.memberX.memberY.a; 
    operations on someLocalVar... 
} 

내가 MSDN library에서, 주제에 대한 공식 설명을 찾고, C#을 사양 등 또는 Microsoft 사람들은 뭔가를 파괴하지하고 모든 것이 잘되어 있는지 확인합니다.

답변

3
  1. 예, 모든 참조 읽기는 원자 적입니다.
  2. 필드 읽기 작업 중 .ldfld 명령이 완료 될 때까지 값이 스택에 푸시 된 시점부터 참조를 수집 할 수 없습니다. 그렇지 않으면 CLR이 사용중인 개체를 수집 할 수 있습니다. 다른 스레드가 값의 인스턴스를 작성하게하면이 문제점과 관련이 없습니다.
  3. 이 마지막 지점에서 무엇을 의미하는지 확신 할 수 없지만 가비지 수집을 너무 많이 걱정한다고 생각합니다. CLR은 개체를 사용하는 동안 개체를 제거하지 않습니다.
+0

2. 다른 스레드가 sharedVar에 새 인스턴스를 할당하면이 참조가 sharedVar에 액세스하는 동안 폐기 된 이전 참조가 발생합니다. 3. 스레드가 명령문에 대한 명령어를 실행하는 동안 어떤 점을 말합니다. SomeClass someLocalVar = sharedVar.memberX.memberY.a; memberY를 읽으면 다른 스레드가 실행되어 null 또는 새 개체를 sharedVar에 할당합니다. 나는 그 참고 문헌이 삭제 될 것이라고 생각하지 않지만 나는 단지 주저하고 공식적인 문서, 설명으로 확실하게하고 싶습니까? 감사합니다. – lockedscope

0

GC에 대해 너무 걱정하고 있습니다. 앞으로 어떤 점에서 & 액세스를 참조 할 수있는 개체는 제거되지 않습니다. 완전히 액세스 할 수없는 개체 만 제거됩니다.