import vibe.core.concurrency; import vibe.core.core; static void compute(Tid tid, Isolated!(double[]) array, size_t start_index) nothrow { foreach( i; 0 .. array.length ) array[i] = (start_index + i) * 0.5; //send(tid, array.move()); // Isolated!T isn't recognized by std.concurrency } void test() { import std.stdio; // compute contents of an array using multiple threads auto arr = makeIsolatedArray!double(256); // partition the array (no copying takes place) size_t[] indices = [64, 128, 192, 256]; Isolated!(double[])[] subarrays = arr.splice(indices); // start processing in threads Tid[] tids; foreach (i, idx; indices) tids ~= runWorkerTaskH(&compute, thisTid, subarrays[i].move(), idx).tid; // collect results auto resultarrays = new Isolated!(double[])[tids.length]; //foreach( i, tid; tids ) // resultarrays[i] = receiveOnly!(Isolated!(double[])).move(); // Isolated!T isn't recognized by std.concurrency // BUG: the arrays must be sorted here, but since there is no way to tell // from where something was received, this is difficult here. // merge results (no copying takes place again) foreach( i; 1 .. resultarrays.length ) resultarrays[0].merge(resultarrays[i]); // convert the final result to immutable auto result = resultarrays[0].freeze(); writefln("Result: %s", result); }
Creates a new isolated array.