parallelism with message passing
Joshua Niehus
jm.niehus at gmail.com
Tue Nov 20 23:18:15 PST 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
----------------
More information about the Digitalmars-d-learn
mailing list