Boost logo

Boost Users :

Subject: Re: [Boost-users] boost::thread join() and DLL unloading
From: Christopher Pisz (cpisz_at_[hidden])
Date: 2011-09-15 11:15:12


John M. Dlugosz <mpbecey7gu <at> snkmail.com> writes:

>
> On 9/14/2011 4:48 PM, Christopher Pisz wrote:
> > I've googled for a few hours and seen people mention something to the
effect
> > of "you cannot call join from DllMain" and "while DLL is unloading", but no
> > explanation or alternative.
> >
> > How would I go about fixing this problem?
> > I don't think I can guarentee noone will ever make a global instance of my
> > class....
>
> As I recall, the DLLMain's as well as process startup code in the main EXE
is called with
> a process mutex, so threads cannot be started until the normal main is
called. Likewise
> at shut-down, but I don't know what happens to other threads. I suspect
they are halted
> before the unloading process begins. Once your main() returns, at some
point threads are
> halted so ensure that threading is done before that!
>
> I assume you mean the DLL is unloading because the process is terminating.
I don't know
> if that's still the case for dynamic LoadLibrary.
>

Yes, at process terminatation, the dll gets unloaded, which calls a
constructor, which attempts to join a thread in a class that has created a
thread with its constructor. I get deadlock.

I did some reading on MSDN and it seems there are severe restrictions on what
can be done at dll load and unload time. So, I think the solution is to
implement a c-style init() and shutdown() methods for the DLL to take care of
any resources it has internally.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net