Re: Destructors & Class Inheritance
<dranger003@gmail.com> wrote in message
news:1146139305.870713.162850@e56g2000cwe.googlegroups.com
I suggest you set m_bAutoDelete to false. Then you can wait for the
thread to exit with
m_pUIThread->PostThreadMessage( WM_QUIT, 0, 0 );
WaitForSingleObject(m_pUIThread->m_hThread, INFINITE);
delete m_pUIThread;
The thread handle becomes signalled when the thread terminates. So
you don't need the event at all.
I actually implemented the code above in my program but I left
m_bAutoDelete to TRUE and everything works anyway. Am I creating a
race condition by leaving m_bAutoDelete to TRUE?
I believe so, yes. If you check the return value of WaitForSingleObject
you will likely find that it reports an error. It probably finishes the
wait not because the handle became signalled but because the handle got
closed and is no longer valid. And of course, that 'delete' in the last
line results in double-deletion.
Consider: worker thread calls PostThreadMessage. Right after this, the
CPU switches to the UI thread, which processes the message and
terminates. Since m_bAutoDelete is TRUE, it also deletes CWinThread
object whose destructor closes the thread handle. The CPU now goes back
to the worker thread which cheerfully accesses a deleted object trought
a dangling pointer, retrieves a garbage value for the handle and passes
that to WaitForSingleObject.
If you are extremely unlucky, that garbage you got from
m_pUIThread->m_hThread might accidentally turn out to be a valid handle
of some random kernel object floating around in your program, and
WaitForSingleObject will actually wait for it - who knows how long.
Also, I would like to wait for the thread to complete its InitInstance
before I can use it. Waiting for the thread handle in order to cleanly
exit is great, but it can't be used to wait to the thread to be
initialized. I guess in this case, I would require an event?
Yes, for this you would need an event.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925