curl-library
Re: Multi-threading deadlock in Windows XP 64-bit
Date: Thu, 25 Oct 2007 16:05:12 +0100
George Woltman wrote:
> My program does all communication in a separate thread.  It calls 
> curl_easy_perform, which calls
> the curl resolver.  This creates a thread.  The C runtime library 
> implementation of _beginthreadex
> calls GetModuleHandle ("KERNEL32.DLL").   If my main message 
> processing thread happens to
> call LoadIcon or SetIcon at this time, then BAM - I've deadlocked.
> I don't fully understand what is causing the deadlock.  Google 
> reveals some articles about the
> dangers of doing any real work in DllMain because the OS has acquired 
> a lock.
There are lots of problems with DllMain, it's true.  
But it seems very unlikely that calls to _beginthreadex in non-main
threads would deadlock against perfectly common functions in the main
thread.  Threads creating further threads is a common and natural
operation.
Isn't the call to GetModuleHandle in _beginthreadex() itself, in the
code which is _creating_ a thread, not in the DllMain() function which
is called in the _created_ thread?  Deadlock only occurs with
DllMain() which _it_ contains a call to a module function.
> Maybe KERNEL32.DLL's DllMain is initializing some thread-local
> storage and tries to acquire Kernel locks that LoadIcon or SetIcon
> is also trying to get.
I doubt if KERNEL32.DLL does that, but if it does, initializing
thread-local storage is one of the few things it's safe to do inside
DllMain() without deadlocking :-)
-- Jamie
Received on 2007-10-25