Re: Destructors & Class Inheritance
Interesting. Thanks Igor, I actually though of you when I wrote this
message, telling myself I would really like to have an answer from
Igor.. ! Really.
Ok, so here's the real story: I am using MFC CWinThread class to spawn
a user interface thread. As you may know CWinThread uses a method
called Delete() which does exactly as above: delete this; when
m_bAutoDelete is set.
Now in order to shut down this thread properly, I call
CWinThread->PostThreadMessage(WM_QUIT, 0, 0) inside the destructor of
my worker thread (the one that started the UI thread) and since I want
to wait for the thread to complete its shut down process, I use an
event which is set in my CWinThread destructor.
So far so good, everything works like a charm, except that 1 out of
30-40 times I get a CWinThread object leak... This would mean I have a
race condition somewhere. Here's my code (stripped for clarity):
// CWorkerThread
CWorkerThread::CWorkerThread() :
m_event( FALSE ) // CEvent initially not owned
{
m_event.ResetEvent(); // Non signaled
m_pUIThread = new CUIWinThread( this );
m_pUIThread->CreateThread();
}
CWorkerThread::~CWorkerThread()
{
m_pUIThread->PostThreadMessage( WM_QUIT, 0, 0 );
// Wait for UI thread to quit
m_event.Lock();
}
// CUIThread
CUIThread::CUIThread( CWorkerThread *pOwnerThread ) :
m_pOwnerThread( pOwnerThread )
{
}
CUIThread::~CUIThread()
{
m_pOwnerThread->m_event.SetEvent();
}
Now when CUIThread's destructor is called, it is called *before*
CWinThread's destructor (according to our previous discussion), which
means the event is fired before the thread has actually completely
cleaned up... This is how I see the problem.
Ideally, I would need to fire the event at the very end of the
destruction of CUIThread.
Any ideas?