지난 며칠 동안 한 스레드가 다른 스레드가 여전히 사용중인 개체를 삭제하는 멀티 스레딩을 디버깅 한 결과,이 문제를 '휘발성'으로 만들 수 있었 더라면 문제를 훨씬 쉽고 빨리 진단 할 수 있다는 것을 깨달았습니다. 시스템 (Symbian OS)의 크래시 덤프가 훨씬 유익한 것으로 바뀌었을 것입니다.왜 'this'가 변동성이 없습니까?
그렇다면 왜 그렇게 될 수 없거나 그렇게해서는 안되는 이유가 무엇입니까?
편집 : 따라서이 시나리오를 방지하거나 확인하는 안전한 방법은 없습니다. 부실 클래스 포인터에 액세스하는 한 가지 해결책은 포인터를 보유하는 전역 변수를 갖는 것이며, 호출되는 함수는 전역 변수를 'this'대신에 사용하는 정적이어야합니다.
static TAny* gGlobalPointer = NULL;
#define Harness static_cast<CSomeClass*>(gGlobalPointer);
class CSomeClass : public CBase
{
public:
static void DoSomething();
private:
int iMember;
};
void CSomeClass::DoSomething()
{
if (!Harness)
{
return;
}
Harness->iMember = 0;
}
따라서 다른 스레드가 전역 포인터를 삭제하고 NULL로 지정하면 즉시 캐치됩니다.
필자가 생각하기에 컴파일러가 Harness의 값을 캐시 할 때마다 매번 검사하는 것이 아니라고 생각합니다.
'this'가 휘발성이거나 'this'가 휘발성 포인터 인 경우 더 쉬웠을 것입니까? 즉, 크래시 덤프에서 오래된 값인 'this'(변경되지 않으므로 조금 이상하게 보임) 또는 일부 데이터 멤버를 보았습니까? –