On 12/18/2010 07:53 AM, Jonathan M Davis wrote:
On Friday 17 December 2010 19:52:19 Vladimir Panteleev wrote:
On Sat, 18 Dec 2010 03:06:26 +0200, Jonathan M Davis<jmdavisp...@gmx.com>
wrote:
And how about every other variable?
I'm sorry, I'm not following you. What other variables?
* Globals and class/struct/function statics are in TLS
* Explicitly shared vars are in the data segment
* Locals are in the stack or registers (no problem here)
* Everything else (as referenced by the above three) is in the heap
Value types which on the stack are going to be okay. That's true. You're right.
They wouldn't be in TLS.
However, anything that involves the heap wouldn't be okay, and that's a _lot_ of
variables. Any and all references and pointers - inluding dynamic arrays - would
be in TLS unless you marked them as shared. So, you'd have to use shared all
over the place except in very simple cases or cases where you went out of your
way to avoid using the heap.
D is designed to avoid using shared memory except in cases where data is
immutable. So, if you try to set up your program so that it uses shared memory
primarily, then you're going to have problems. And not calling the static
constructors on thread creation would mean using shared memory for everything
which uses the heap. You couldn't even create local variables which are class
objects using TLS in such a case, because they might have a static constructor
which then would never have been called.
Really, I don't think that trying to avoid calling static constructors is going
to work very well. It may very well be a good reason to minimize what's done in
static constructors, but skipping them entirely would be very difficult to pull
off
safely.
- Jonathan M Davis
The heap is the heap is the heap. You can have local variables on the
heap which are not shared. I think you are overstating the need for
shared, probably some misunderstanding.
You could not have classes/structs with static members, or call
functions with static variables. Everything else should work, probably.
The spawned thread could use the parent thread immutable globals, to
avoid the need to construct them in the spawned tls. I don't know if
this is actually possible :-)