Hi Tommy,
The issue with SupportsWeakPtr isn't to do with threading, but destructor ordering.
The derived class' desrructor will always be executed first, including member destruction, but only after that will the base SupportsWeakPtr destructor run, invalidating WeakPtrs to it - anything in the derived class' destructor, or triggered by a member's destructor, that triggers that WeakPtr to be dereferenced will succeed, but be accessing a partially-destructed class.
The solution is really to replace SupportsWeakPtr w/ WeakPtrFactory.
HTH,
Wez