2009-11-24 4 views
1

이 스레딩 시나리오를 오해 할 수도 있습니다.하지만 그것이 내가 묻는 이유입니다.스레드 A를 실행중인 객체가 스레드 B에 의해 파괴되면 어떻게됩니까?

다음 상황 (C# 스레딩을 가정)에서 어떤 일이 발생합니까? 참고 :이 시나리오는 핵심 문제로 단순화되어 추가 기능은 무시됩니다.

2 개의 객체 a와 b가 각각 클래스 A와 B의 인스턴스입니다. 'b'는 'a'의 멤버입니다.

'b'는 처리 루프를 실행 중이고 계속해서 다른 작업을 수행하고 있습니다. 한 지점에서 'b'는 'a'로 이벤트를 보내는 상황을 감지합니다. 'a'가이 이벤트를 수신하면 다음 코드를 실행합니다.

void b_eventFoo() 
{ 
    b.UnhookEvents();//clears the delegate that truggered this event function 
    this.b = new B();   
    b.HookEvents(this);//connects the new b object to this A 
} 

이전 'B'객체는 어떻게됩니까? 원래 'b'는 여전히 일부 처리를 수행 중이며 이벤트를 트리거 한 스레드가 여전히 실행 중일 수 있습니다. 나는이 시나리오의 결과를 예측할만큼 충분히 스레딩을 이해하지 못한다.

상관 없습니까?

아무 것도 명확히해야하는지 알려주세요.

답변

2

, 당신은 :

Thread1: [A1] -----field ----> [B1] 
       <--- event ----- 

당신은 B1에 루프를 실행, 새로운 스레드를 만들; 여기에서 핵심은 대리자와 인스턴스 메소드 (사용 중) 자체가 인 경우 인스턴스에 대한 참조가 있다는 것입니다 (IL 용어로 "arg0"). 그래서 당신은이 :

Thread1: [A1] ---- field ----> [B1] 
       <--- event ----- ^
Thread2: ------------------------^ 

그런 다음 이벤트 고리를 벗기고 분야 취소 :

Thread1: [A1] ---- field ----> [nil] 

Thread2: --------------------> [B1] 

을 그리고 다시하고 다른 인스턴스에 대해 rehook : 그래서

Thread1: [A1] ---- field ----> [B2] 
       <--- event ----- 

Thread2: --------------------> [B1] 

: 스레드가 처리를 계속 [B1]에 대해 더 이상 영향을 미치지 않음 [A1]

2

원본 B가 계속 실행 중이면 그 참조를 잃을 것입니다.

+1

B에 대한 유일한 참조 인 경우 삭제되지 않음 b y 가비지 컬렉터? –

+2

@valya, 스레드가 종료 된 후에 만 ​​스레드 처리기가 참조를 유지하므로 A 참조가 유일한 것이 아닙니다. – Dathan

+2

valya : 아니요, 스레드의 스택도 'this'로 최소한 'b'에 대한 참조를 보유합니다. –

0

이전 B은 여전히 ​​실행 중이며 A에 대한 참조를 가지고 있습니다. A은 (는) 더 이상 B을 인식하지 못하기 때문에 매우 좋지 않은 상황입니다.

가능한 모든 경우, 특히 이와 같은 작업 순서가 발생할 수있는 경우 순환 참조가 발생하지 않도록해야합니다. AB을 사용하고 BA을 사용하는 이유는 무엇입니까? 그들은 서로 밀접하게 결합되어있어 서로의 구성원에게 액세스하고 있습니다. 시작시

+0

B에는 A? 그 사건을 의미하니? 참조 A가 B를 잃어 버리기 전에 연결이 끊어집니다. 내가 겪고있는 문제를 이해할 수 없다. 설명해주세요. – CodeFusionMobile

+0

실제 응용 프로그램에서와 같이 이벤트를 언 Hook하기 위해 OP를 편집했습니다. 이전에 이것을 포함하는 것을 잊었습니다. 새 b 만 b_eventFoo에 대한 참조를 갖습니다. – CodeFusionMobile