I keep getting data from within a struct shared across threads for apparently no reason: the code is the following:

import std.stdio;
import std.concurrency;
import core.thread : Thread, thread_joinAll;

struct Foo
{
    int a;
    int b;

    this(int a, int b)
    {
        this.a = a;
        this.b = b;

writefln("Constructor -> a: %s, b: %s, &a is %s, &b: %s, this: %s, Thread: %s", this.a, this.b, &this.a, &this.b, &this, Thread.getThis.id);
    }

    ~this()
    {
        writefln("Final values were a:%s, b:%s", a, b);
    }

    void ping() shared
    {
        import core.time: dur;

writefln("a: %s, b: %s, &a: %s, &b: %s, this: %s, Thread: %s",
         a, b, &a, &b, &this, Thread.getThis.id);

        a = 0;
        b = 0;
    }

    void fire()
    {
        spawn(&explode);
    }

    void explode() shared
    {
        ping();
    }
}

void main()
{
    auto a = Foo(1, 2);
    a.fire();

    thread_joinAll();
}

What I get on screen is the following:
Constructor -> a: 1, b: 2, &a is 7FFD5D9E3928, &b: 7FFD5D9E392C, this: 7FFD5D9E3928, Thread: 139774191032448 a: 1, b: 2, &a: 7FFD5D9E3928, &b: 7FFD5D9E392C, this: 7FFD5D9E3928, Thread: 139774178481920
Final values were a:0, b:0

So effectively, the thread spawned does have access to the original struct and is able to modify it.

Is there anything I'm doing wrong? I won't lie, data sharing is the only thing about D I don't find quite usable yet. Can anybody help me out on this?

Reply via email to