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
----------------