On Wednesday, 22 February 2017 at 08:20:41 UTC, Jonathan M Davis
wrote:
Well, the OP's code wrapped the Thread object in another class
and joined the thread in its finalizer, so you would think that
the Thread would be joined before its finalizer was called, but
thinking further on it, IIRC, there's no guarantee that the GC
wouldn't try and collect the Thread object before calling the
finalizer (since there are no other references to the Thread).
So, I suppose that it could fail because of that. But if that
doesn't happen, it should work, because the wrapper calls join
rather than simply letting the Thread be destroyed.
True – I was thinking of the subclassing example also shown above.
In any case, I don't know if manually running a collection like
I showed would work or not, but if not, I wouldn't expect
calling join in a finalizer to work in general.
Yes, it wouldn't work in general – mThread isn't guaranteed to be
around any longer in ~this() for a normal object (although the
thread lifetime relationship mentioned above complicates the
analysis here somewhat, and if the thread is never stopped
somewhere else, it might just as well work by accident).
— David