タスクスケジューリングによる並列処理。
・タスク
小さなタスクを大量に並列に処理していく
実行順序は「fair ではない」
パフォーマンス上の理由から LIFO で処理される
(その方が局所性が効く)
タスクを登録してから、実際に実行されるまでに間が開いたりすることも
・スレッド、スレッドの再利用、タスクスケジューリング
スレッドは開始するのも大変だし、コンテキストスイッチが大変
CPU コア数分だけスレッドを立てて、使いまわすのが効率的
そこでタスクスケジューリング
タスクをキューに登録しておく
各スレッドは処理が終わり次第、キューを見に行って、次のタスクを開始
・Task クラス
StartNew
重たい処理の場合には
タスクの親子関係
継続(continuation)タスク
例外の伝搬
・Parallel クラスと PLINQ
並列処理の多くは Map-Reduce 型
対応付け(map)、あるいは、射影(project)
x → f(x)
集合の個々の要素に対して、何らかの処理を行う
各要素は独立(同時に実行しても競合しない)
縮約(reduce)、あるいは、集計(aggregate)
∑ x_i
わかりやすいのは総和や累積
一般化すると、
var sum = defautl(T);
foreach (var x in list)
sum = BinaryOperation(sum, x);
BinaryOperation の部分がスレッドを超えた影響起こさないなら割と並列化が容易
このタイプの並列処理を行うのが Parallel クラスと PLINQ