다른 스레드가 해당 개체에 대한 메서드를 실행하는 동안 개체 참조 무효화(.NET)

StackOverflow https://stackoverflow.com/questions/1290873

문제

(저는 .NET CLR에 관심이 있습니다)

한 스레드가 변수가 참조하는 개체를 변경하는 동안 다른 스레드가 원래 개체에 대해 메서드를 실행하면 정확히 무슨 일이 발생합니까?

예를 들어 다음 유형을 말해보세요. Foo 유형의 변수 'Bar'가 있습니다. Bar, 그리고 Bar 클래스 수준 상태가 없습니다(적어도 지금은 이 시나리오를 간단하게 유지하고 싶습니다).

// Thread 1
foo.Bar = new Bar();
foo.Bar.SomeMethod();

그동안 실행이 완료되기 전에 ...

// Thread 2
foo.Bar = new Bar();

스레드 1에서 실행 중이던(이전?) 메서드는 어떻게 되나요?완료하는 데 필요한 모든 것이 이미 스택에 있습니까?

스레드 2가 대신 이 작업을 수행하면 상황이 바뀌나요?

foo.Bar = null;
도움이 되었습니까?

해결책

통화가 이미 내부에 있도록 보장 된 경우 SomeMethod(), 그러면 비정상적인 일이 일어나지 않을 것입니다. this 방법에 대한 암묵적인 인수이므로 필드 (또는 속성)의 가치를 직접 사용하지 않을 것입니다.

당신이 진정으로 그것을 보장 할 수 있는지 여부는 또 다른 문제입니다.

다른 팁

-- 편집하다:헷갈리는 문장을 바로잡았습니다.

글쎄, 실제로 변수에 할당하는 것은 원자가 될 것이므로, 전화가 갑자기 '오, 나는 null!' .somemethod ()를 실행하는 동안

무엇 ~할 수 있다 하지만 foo.Bar.SomeMethod() 자체는 호출되지 않습니다. 스레드 2가 (아마도) 이를 먼저 null로 설정하기 때문입니다.따라서 실행되지 않습니다(null ref 예외로 인해 충돌이 발생함).

첫 번째 예에도 동일하게 적용됩니다.새 객체에 대해 .SomeMethod를 호출하기만 하면 됩니다.

.SomeMethod가 실행되는 동안 상황이 바뀔 수 있다고 생각하시는 것 같은데요, 그렇죠?아니요.거기에서는 아무것도 변하지 않을 것입니다.그것은 여전히 ​​그 자체의 맥락을 가질 것입니다.

한 스레드가 객체를 변수 참조로 변경하는 동안 다른 스레드가 원래 객체에서 메소드를 실행하는 경우 정확히 어떻게됩니까?

이 필드에 대한 액세스를 올바르게 동기화하기 위해 코드를 다시 작성하는 것이 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top