static void f(string msg) { assert(msg == "Hello World"); } auto tid = spawn(&f, "Hello World");
Fails: char[] has mutable aliasing.
string msg = "Hello, World!"; static void f1(string msg) {} static assert(!__traits(compiles, spawn(&f1, msg.dup))); static assert( __traits(compiles, spawn(&f1, msg.idup))); static void f2(char[] msg) {} static assert(!__traits(compiles, spawn(&f2, msg.dup))); static assert(!__traits(compiles, spawn(&f2, msg.idup)));
New thread with anonymous function
spawn({ ownerTid.send("This is so great!"); }); assert(receiveOnly!string == "This is so great!");
* Starts fn(args) in a new logical thread. * * Executes the supplied function in a new logical thread represented by * Tid. The calling thread is designated as the owner of the new thread. * When the owner thread terminates an OwnerTerminated message will be * sent to the new thread, causing an OwnerTerminated exception to be * thrown on receive(). * * Params: * fn = The function to execute. * args = Arguments to the function. * * Returns: * A Tid representing the new logical thread. * * Notes: * args must not have unshared aliasing. In other words, all arguments * to fn must either be shared or immutable or have no * pointer indirection. This is necessary for enforcing isolation among * threads. * * Similarly, if fn is a delegate, it must not have unshared aliases, meaning * fn must be either shared or immutable.