Re: Endless static this call when used a thread in it

2015-01-15 Thread Steven Schveighoffer via Digitalmars-d-learn

On 1/13/15 8:56 AM, tcak wrote:


When I defined static init with shared

public shared static this()

it works normal now. But it doesn't explain above issue. What's the
relation between a new thread and a module's initialiser?


In case it's not clear -- shared static this runs ONCE at the beginning 
of the program (before main() starts), static this runs for EVERY thread 
that starts, before the thread starts execution.


The reason is that "static this" initializes thread local data. "shared 
static this" initializes global data (i.e. shared and __gshared).


Hope this helps.

-Steve


Re: Endless static this call when used a thread in it

2015-01-13 Thread Daniel Kozak via Digitalmars-d-learn
On Tuesday, 13 January 2015 at 14:02:45 UTC, Daniel Kozák via 
Digitalmars-d-learn wrote:

V Tue, 13 Jan 2015 13:56:05 +
tcak via Digitalmars-d-learn 
napsáno:


On Tuesday, 13 January 2015 at 13:53:11 UTC, tcak wrote:
> I have written the following code:
>
> test.d
> ==
> import core.thread;
> import std.stdio;
>
> void threadFunc(){
>writeln("Thread func");
> }
>
> public static this(){
>auto t = new Thread( &threadFunc );
>t.start();
>
>writeln("Static init");
> }
>
> void main(){
>  writeln("End of main");
> }
>
>
> run
> ==
> rdmd test.d
>
>
> result
> ==
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Sta...
>
> Is this normal, what's happening?

When I defined static init with shared

public shared static this()

it works normal now. But it doesn't explain above issue. 
What's the relation between a new thread and a module's 
initialiser?


I am not sure but my guess is

static this needs to be called before anything else in module 
so when
you try call threadFunc it looks if static this has been called 
and

finished which is not true so it call it again

And here is better explanation

http://dlang.org/module.html#staticorder

Static constructors are code that gets executed to initialize a 
module or a class before the main() function gets called.

...

Static constructors and static destructors run on thread local 
data, and are run whenever threads are created or destroyed.


Re: Endless static this call when used a thread in it

2015-01-13 Thread Daniel Kozák via Digitalmars-d-learn
V Tue, 13 Jan 2015 13:56:05 +
tcak via Digitalmars-d-learn 
napsáno:

> On Tuesday, 13 January 2015 at 13:53:11 UTC, tcak wrote:
> > I have written the following code:
> >
> > test.d
> > ==
> > import core.thread;
> > import std.stdio;
> >
> > void threadFunc(){
> > writeln("Thread func");
> > }
> >
> > public static this(){
> > auto t = new Thread( &threadFunc );
> > t.start();
> >
> > writeln("Static init");
> > }
> >
> > void main(){
> >  writeln("End of main");
> > }
> >
> >
> > run
> > ==
> > rdmd test.d
> >
> >
> > result
> > ==
> > Static init
> > Thread func
> > Static init
> > Thread func
> > Static init
> > Thread func
> > Static init
> > Thread func
> > Static init
> > Thread func
> > Static init
> > Thread func
> > Static init
> > Thread func
> > Static init
> > Thread func
> > Sta...
> >
> > Is this normal, what's happening?
> 
> When I defined static init with shared
> 
> public shared static this()
> 
> it works normal now. But it doesn't explain above issue. What's 
> the relation between a new thread and a module's initialiser?

I am not sure but my guess is

static this needs to be called before anything else in module so when
you try call threadFunc it looks if static this has been called and
finished which is not true so it call it again



Re: Endless static this call when used a thread in it

2015-01-13 Thread ketmar via Digitalmars-d-learn
On Tue, 13 Jan 2015 13:56:05 +
tcak via Digitalmars-d-learn  wrote:

> it works normal now. But it doesn't explain above issue. What's 
> the relation between a new thread and a module's initialiser?
yes.


signature.asc
Description: PGP signature


Re: Endless static this call when used a thread in it

2015-01-13 Thread Daniel Kozák via Digitalmars-d-learn
V Tue, 13 Jan 2015 13:53:09 +
tcak via Digitalmars-d-learn 
napsáno:

> I have written the following code:
> 
> test.d
> ==
> import core.thread;
> import std.stdio;
> 
> void threadFunc(){
>   writeln("Thread func");
> }
> 
> public static this(){
>   auto t = new Thread( &threadFunc );
>   t.start();
> 
>   writeln("Static init");
> }
> 
> void main(){
>   writeln("End of main");
> }
> 
> 
> run
> ==
> rdmd test.d
> 
> 
> result
> ==
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Static init
> Thread func
> Sta...
> 
> Is this normal, what's happening?

try

shared static this(){
...

instead of

public static this(){



Re: Endless static this call when used a thread in it

2015-01-13 Thread tcak via Digitalmars-d-learn

On Tuesday, 13 January 2015 at 13:53:11 UTC, tcak wrote:

I have written the following code:

test.d
==
import core.thread;
import std.stdio;

void threadFunc(){
writeln("Thread func");
}

public static this(){
auto t = new Thread( &threadFunc );
t.start();

writeln("Static init");
}

void main(){
 writeln("End of main");
}


run
==
rdmd test.d


result
==
Static init
Thread func
Static init
Thread func
Static init
Thread func
Static init
Thread func
Static init
Thread func
Static init
Thread func
Static init
Thread func
Static init
Thread func
Sta...

Is this normal, what's happening?


When I defined static init with shared

public shared static this()

it works normal now. But it doesn't explain above issue. What's 
the relation between a new thread and a module's initialiser?


Endless static this call when used a thread in it

2015-01-13 Thread tcak via Digitalmars-d-learn

I have written the following code:

test.d
==
import core.thread;
import std.stdio;

void threadFunc(){
writeln("Thread func");
}

public static this(){
auto t = new Thread( &threadFunc );
t.start();

writeln("Static init");
}

void main(){
 writeln("End of main");
}


run
==
rdmd test.d


result
==
Static init
Thread func
Static init
Thread func
Static init
Thread func
Static init
Thread func
Static init
Thread func
Static init
Thread func
Static init
Thread func
Static init
Thread func
Sta...

Is this normal, what's happening?