November 21, 2012
Hello,
Im starting one process in the main thread who in turn is going to kick off another process but has no way of passing along main's Tid, hence the shared(Tid) nonsense.
* This works in serial (i.e. change workUnitSize > x.length in mains foreach loop).
* It also works when passing the tid directly into f.run(mainTid) with workUnitSize == 1
But I get a crash when attempting to run in parallel with a "shared" tid (see below).
Any ideas how to make this work?
Thanks,
Josh

// garbage: newb playing with threads
module test;
import core.thread;
import std.concurrency, std.parallelism, std.stdio;

shared(Tid) mainTid;

struct Foo {
    void run() {
        Thread.sleep(dur!"seconds"(1));
        writeln(cast(Tid)mainTid);
        send(cast(Tid)mainTid, true);
    }
}

void someAction(Tid tid) {
    mainTid = cast(shared(Tid))tid;
}

void main() {
    Foo[] x = [Foo(), Foo(), Foo()];
    spawn( &someAction, thisTid );
    foreach(f; taskPool.parallel(x, 1)) {
        f.run();
        receiveTimeout(dur!"seconds"(3),
            (bool x) { writeln("received"); }
        );
    }
}
// exception output:
core.exception.AssertError@/usr/share/dmd/src/phobos/std/concurrency.d(1007): null this
----------------
5   test                                0x000000010604a4ad _d_assert_msg + 69
6   test                                0x0000000106032523 bool std.concurrency.MessageBox.get!(core.time.Duration, void function(bool)*).get(scope core.time.Duration, scope void function(bool)*) + 83
7   test                                0x00000001060324bb bool std.concurrency.receiveTimeout!(void function(bool)*).receiveTimeout(core.time.Duration, void function(bool)*) + 59
8   test                                0x000000010602c5c7 void test.main().int __foreachbody1416(ref test.Foo) + 71
9   test                                0x00000001060320f0 int std.parallelism.ParallelForeach!(test.Foo[]).ParallelForeach.opApply(scope int delegate(ref test.Foo)).void doIt() + 256
10  test                                0x00000001060583f4 void std.parallelism.run!(void delegate()).run(void delegate()) + 20
11  test                                0x000000010605800c void std.parallelism.__T4TaskS213std11parallelism3runTDFZvZ.Task.impl(void*) + 24
12  test                                0x0000000106056da3 void std.parallelism.AbstractTask.job() + 15
13  test                                0x0000000106056df9 void std.parallelism.TaskPool.doJob(std.parallelism.AbstractTask*) + 33
14  test                                0x0000000106056f20 void std.parallelism.TaskPool.workLoop() + 132
15  test                                0x000000010603f915 void core.thread.Thread.run() + 49
16  test                                0x000000010603ec5a thread_entryPoint + 334
17  libsystem_c.dylib                   0x00007fff9681f742 _pthread_start + 327
18  libsystem_c.dylib                   0x00007fff9680c181 thread_start + 13
19  ???                                 0x0000000000000000 0x0 + 0
----------------