Static constructors in circularly imported modules - again
Max Samukha
spambox at d-coding.com
Thu May 27 05:36:45 PDT 2010
On 05/27/2010 01:37 PM, Max Samukha wrote:
>
> module a;
> mixin template Foo()
> {
> static immutable Object foo;
> shared static this()
> {
> foo = cast(immutable)new Object;
> }
> }
>
> ----
> module b;
> import a;
> import c;
>
> mixin Foo;
>
> ----
> module c;
> import a;
> import b;
>
> mixin Foo;
>
> In this scenario one is forced to avoid static constructors by lazily
> initializing foo and using some kind of synchronization, which should be
> absolutely unnecessary and sometimes is not tolerable.
>
Ok, I've just thought of a way to avoid synchronization (using __gshared
for simplicity):
module a;
mixin template Foo()
{
static __gshared Object foo; // shared foo
static Object tlFoo; // thread-local foo
Object getFoo()
{
if (!tlFoo)
{
synchronized(lock)
{
if (!foo)
foo = new Object;
}
tlFoo = foo;
}
return tlFoo;
}
}
There is still unnecessary overhead of accessing and testing the
thread-local variable.
More information about the Digitalmars-d
mailing list