2011-08-01 2 views
1

ATL을 사용하는 free-threaded in-proc COM 개체에서 FinalConstruct()에만 설정되고 FinalRelease()으로 읽기 전용 멤버 변수를 추가하고 싶습니다. 다른 코드는 그 멤버 변수를 조작하지 않습니다.FinalConstruct()/FinalRelease() 내부에 동기화가 필요합니까?

해당 멤버 변수에 액세스 할 때 동기화가 필요한지 의심 스럽습니다. 나는 ATL 소스를주의 깊게 읽었으며 그 방법은 항상 한 번만 호출되므로 한 스레드에서만 호출됩니다.

올바른 가정입니까? 동기화를 생략 할 수 있습니까?

답변

3

예, 가정은 정확합니다. 그것을 C++ 생성자와 소멸자의 확장으로 생각하십시오. 이론적으로는 FinalRelease()이 실행되는 동안 다른 스레드에서 COM 개체에 대한 메서드를 호출 할 수 있습니다. 그것은 예상되지 않은 동작이지만 예측 된 발생은 아닙니다. 소멸자의 다른 스레드로부터 자신을 보호하지 않으려는 것처럼 자신을 보호하려고해서는 안됩니다. 소멸자에서 자신을 보호해야하는 경우 일반적으로 디자인이 손상됩니다 (스레드간에 적절한 종료 프로토콜이 없음을 나타냄).

다른 스레드에서 FinalRelease()을 호출 할 수있는 유일한 방법은 클라이언트 코드에 개체에 대한 유효한 참조 수가없는 경우 또는 코드의 다른 부분이 두 번 릴리스되는 경우입니다. 이것은 어려운 오류이며 어쨌든 충돌로 끝날 것이며 동기화 오류와는 전혀 관련이 없습니다. 개체 참조 수를 관리하기위한 ATL 코드는 스레드로부터 안전하며 모든 경쟁 조건을 열어 두지 않습니다.

FinalConstruct()의 경우 FinalConstruct()이 성공적인 리턴 코드로 완료되기 전에 오브젝트에 대한 참조가 클라이언트로 리턴되지 않습니다.

관련 문제