In the documentation, it talks about derived threads in one of the examples. That's one way to do this:

import core.thread;

// Thread sub class can hold data
// we pass the params through the constructor
class MyThread : Thread {
        uint* var;
// ref only works one level deep - it stops being ref when you assign it somewhere else
       // so we use a pointer instead
        this(uint* var) {
                this.var = var;
                super(&run);
        }
        void run() {
                uint v = *var << 1;
                *var = v;
        }
}
int main()
{
    uint val = 7;
    auto thread1 = new MyThread(&val).start();
    thread1.join();
    return 0;
}



You can also use a delegate inline instead of a separate function:

import core.thread;
int main()
{
    uint val = 7;
      // the inline defined {} returns a delegate which
      // Thread will accept, and it can access local vars
      // directly
    auto thread1 = new Thread({ val <<= 1; } ).start();
    thread1.join();
    return 0;
}


That delegate is the shortest code but keep in mind that val is now shared by the main thread and the child thread and may be written to by both of them at once...


Or there's also http://dlang.org/phobos/std_concurrency.html#spawn

the spawn function from std.concurrency, which is meant to give you functions for message passing between threads but also lets you start one like this:


import core.thread, std.concurrency;

void thread_proc(shared(uint)* var)
{
    uint v = *var << 1;
    *var = v;
}

int main()
{
    shared(uint) var = 7; // has to be shared tho!
    spawn(&thread_proc, &var); // pass args to it here

thread_joinAll(); // it doesn't return the Thread object though... spawn returns a Tid used for send and receive messages, so we join differently

    return 0;
}



The big change here is the explicit shared(uint) instead of plain uint. core.thread lets you share stuff implicitly (which can get weird with two threads writing to it at the same time). std.concurrency requires you to be more explicit about it.

Reply via email to