Έχουν δημοσιευτεί
Δευτέρα, 2 Μαρτίου 2009 7:02 μμ
από το μέλος
PALLADIN
Όσοι φίλοι ενδιαφέρονται για parallel programming, τότε σίγουρα θα βρούν εξαιρετικά ενδιαφέρουσα την παρουσίαση που έκανε
ο Daniel Moth πριν από μερικούς μήνες στην Αθηνα.
Την ώρα που παρακολουθούσα το code demo ... μου ήρθε η ιδέα να κάνω abstract το recursive tree traversal και
να "κρύψω" το parallelism πίσω από την "μαγική" fold.
Μετά από λίγο πειραματισμό με το νέο Parallel API, κατέληξα σε αυτό:
interface IBinaryTreeNode<out T>
{
IBinaryTreeNode<T> Left { get; }
IBinaryTreeNode<T> Right { get; }
T Data { get; }
}
static TResult FoldBinaryTree<TInput, TResult>(IBinaryTreeNode<TInput> treeNode, Func<TInput, TResult, TResult, TResult> accumulatorFunc, Func<TResult> seedFunc)
{
if (treeNode == null) return seedFunc();
Future<TResult> leftFuture = new Future<TResult>(() => FoldBinaryTree(treeNode.Left, accumulatorFunc, seedFunc));
leftFuture.Start();
Future<TResult> rightFuture = new Future<TResult>(() => FoldBinaryTree(treeNode.Right, accumulatorFunc, seedFunc));
rightFuture.Start();
return accumulatorFunc(treeNode.Data, leftFuture.Value, rightFuture.Value);
}
int numberOfNodes = FoldBinaryTree(treeNode, (_, numberOfLeftChildren, numberOfRightChildren) => 1 + numberOfLeftChildren + numberOfRightChildren, () => 0);
The future is parallel