// Count down until all 4 are signaled
CountdownEvent ce = new CountdownEvent(4);
ce.Signal();
ce.Wait();
// count up by add one for each work
ce = new CountdownEvent(1);
ce.AddCount(1);
ce.Signal();
ce.Wait();
// Inlining -- Recursive Decomposition
// walk by directly parallel
void Walk2<T>(Tree<T> root, Action<T> action)
{
if (root == null) return;
Parallel.Invoke(
()=> action(root.Data),
() => Walk2(root.Left, action),
() => Walk2(root.Right, action));
}
//Continuation Chaining
// Parallel <> Sum of Tasks, Unwrap() map Task<Task> to Task for Completion.
if (root == null) return _CompletedTask;
Task<Task> t2 = Task.Factory.StartNew(() => Walk(root.Left, action));
Task<Task> t3 = Task.Factory.StartNew(() => Walk(root.Right, action));
return Task.Factory.ContinueWhenAll(new Task[] { t1, t2.Unwrap(), t3.Unwrap() },
task => Task.WaitAll(task));
public static Task _CompletedTask = ((Func<Task>)(() =>
{
TaskCompletionSource<object> ts = new TaskCompletionSource<object>();
ts.SetResult(null);
return ts.Task;
}))();
//Parallel with options:
// option can cacell, set schedule, MaxDegree.
// Parallel.For can be stoped by loop.Stop() inside For
Parallel.Invoke(opts, () => { }, () => { }, () => { });
CancellationTokenSource ts = new CancellationTokenSource();
ParallelOptions opts = new ParallelOptions()
{
MaxDegreeOfParallelism = 2,
TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext(),
CancellationToken = ts.Token
};
ParallelLoopResult res = Parallel.For(0, 10000, () => 1, (j, loop, sub) =>
{
if (loop.ShouldExitCurrentIteration) return 0;
loop.Stop();
Sunday, July 6, 2014
TPL Fork Join code Pattern
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment