Concurrentcy with per thread housekeeping task idea
Charles Hixson
charleshixsn at earthlink.net
Fri Nov 22 14:17:18 PST 2013
Is this a plausible approach?
What I've sketched out so far is:
/** cells2.d */
import std.concurrency;
import std.stdio;
import cellsdb;
Tid tids[8];
void cellLoop (int i)
{ Cells[ulong] cells;
bool rcv = true;
int thisTin = i;
for(;;)
{ foreach (k, v; cells)
{
while (rcv)
{ rcv = receiveTimeout (0,
//TODO Write the messages that actually do the work.
(Variant any)
{ writefln ("cellLoop couldn't handle
receiving {0}".
format(any.type);
}
}
//TODO housekeeping on cells.
} // foreach (k, v; cells)
//TODO handle any deletions from cells
} // for(;;)
} // cellLoop
/** Given an id#, return the index to the thread id in which it
should be found. */
Tin idToTin (ulong id)
{ return (id / 2^13) % tids.length; }
void main()
{
for (int i = 0; i < tids.length; i++) tids[i] =
spawn (&cellLoop, i);
//TODO start the threads working
}
There's a bunch of other code, but it's off the point. Part of the
reason for the idToTin method is that cells close together are expected
to make mutual calls more often. My expectation is that message passing
is more expensive than subroutine calls, so if calls are within the same
thread, they can be called directly rather than making message passing
invocations. I'm sharing the array of Tids, but it's only written
once. I'd make it immutable if I could figure out how...short of
wrapping everything in a class with an init method.
The basic (questionable) idea here is that the best way to step through
an AA is to use foreach, so the if I want to do the housekeeping in
short runs (so the threads don't slow interaction) I need to have the
receive within the foreach. The alternative approach I came up with is
to store the data in a RedBlack tree, which would make it easy to
interrupt and resume whenever I needed, but which is less efficient for
access than a hash table. The penalty is that I ALWAY do at least one
housekeeping task between each receive. Also, when I need to break out
of the inner loop to allow for cell deletion, I start over from the
beginning, without ever having processed the end. Not good, as cell
deletions aren't expected to be all that rare.
--
Charles Hixson
More information about the Digitalmars-d-learn
mailing list