Threads and static initialization.

Jonathan M Davis jmdavisProg at gmx.com
Fri Dec 17 14:33:43 PST 2010


On Friday 17 December 2010 13:47:05 wrzosk wrote:
> I believe that when new thread is being created, all static data is
> initialized inside new thread. What worries me is the fact, that many
> 'mini' threads will initialize all static data inside application. This
> may be somewhat time consuming.
> Maybe there should be a possibility to define 'Pure' thread that doesnt
> touch any static data, and in turn it could leave static constructors
> untouched.
> 
> What do you think

That seems like it would be _really_ hard to do - probably impossible. The 
compiler would have to know which functions, types, and variables a thread 
accessed. I don't believe that compiler really knows anything about threads. It 
doesn't know which thread calls a particular function or accesses a particular 
variable. It knows about thread-local storage vs shared storage, and the type 
system restricts conversions between the two, but to do what you're suggesting, 
you'd have to have the compiler know which thread is calling which function and 
disallowing - at compile time - certain threads from calling certain functions. 
As it is, any thread can call anything and the compiler makes no attempt at 
tracking any of that. It just has restrictions with regards to thread-local and 
shared.

So, while it certainly seems like a good idea, I don't see how it would really 
be possible. It might be possible to make it so that a thread could be created 
which did not initialize any module or static variables (be they at class, 
struct, or function scope), but I don't see how the compiler could enforce that 
none of those variables were used. It would have to be up to the programmer to 
only call pure functions.

What _might_ be possible would be if you had a way of starting a thread which 
took a function (or overrode one) and that function _had_ to be strongly pure. 
Then it could skip running static constructors, because it would be impossible 
for any static variables to be accessed. However, the only way that you'd then 
get access to anything that thread did was from the return value of the function 
that started it, which not raises the issue of how you'd get the return value 
with the asynchronous nature of threads, but it would restrict the usage of such 
threads to the point that they'd be practically useless.

I think that you raise a valid concern, but I don't think that that's the way to 
handle it. Restricting static constructors and global or static variables in 
practice will help, and using immutable more will help. But if we want a means 
of making threads more lightweight, we probably need to look at a different way 
of doing it than you're suggesting.

This does make me wonder about static constructors and immutable though. It's 
currently possible to assign to both immutable and mutable module-scope 
variables in a static constructor. Such static constructors _must_ run for every 
thread or the thread-local portions are going to be wrong, but you _can't_ run 
them for immutable variables or you aren't sharing them between threads (or 
you're reassigning them each time that at new thread is created - I think that 
there's currently a bug on that). Perhaps static constructors which assign to 
immutable variables should have to be immutable, and mutable variables would 
have to be assigned in non-immutable static constructors. Then the immutable 
static constructors only get run once with the main thread, whereas the non-
static ones get run for every thread.

- Jonathan M Davis


More information about the Digitalmars-d mailing list