On Mon, 08 Aug 2011 12:17:28 -0600, Kai Meyer wrote: > I am playing with threading, and I am doing something like this: > file.rawRead(bytes); > auto tmpTask = task!do_something(bytes.idup); > task_pool.put(tmpTask); > Is there a way to avoid the idup (or can somebody explain why idup here > is not expensive?) > > If the logic above is expressed as: > Read bytes into an array > Create a thread (task) to execute a function that takes a copy of > 'bytes' Execute the thread > > I wonder if I could: > Create a thread (task) > Read bytes directly into the tasks' thread local storage Execute the > thread
I don't know what copies happen behind the scenes in the following code, but std.paralleism is great when threads don't need to interact with each other: import std.stdio; import std.parallelism; void main() { ubyte[8][10] buffers; foreach (i, ref buffer; parallel(buffers[])) { ubyte value = cast(ubyte)i; workWith(value, buffer); } writeln(buffers); } void workWith(ubyte value, ref ubyte[8] buffer) { foreach (ref b; buffer) { b = value; } } Notes: - I had to give buffers[] to parallel() as it calls popFront() which my constant-size array can't provide. (Yes, I could have used a dynamic array.) - Note the three ref's that I used; two of those are because constant- size arrays are value types. Ali