共通言語ランタイムはロックやスレッド、スレッドプールという形で、並列プログラミングに対して常に基本的にサポートしてきた。マルチコアCPUがますます重要視されるにつれ、高度な並列プログラミングのコンストラクトに対する関心が新たになった。
不変オブジェクトと、その本質的にスレッドセーフな特性に重点を置いた関数型プログラミングに期待している人々が大勢いる。Haskell(リンク)や、OCaml(リンク)ベースの言語F#(リンク)がこのカテゴリーに入る。その他の人たちは、メッセージパッシングと軽量プロセスをベースにしたErlangのような言語を好む。MicrosoftはF#のサポートに加え、適切な抽象概念を発見しようという取り組みの中で、いくつかの異なるアプローチを試している。
最初に発表されたのがParallel LINQ(参考記事・英語)で、PLINQとも呼ばれている。SQLのように、言語そのものが並列化を処理するので、開発者が手を加える必要はない。クエリに対して単にAsParallelを追加すれば、それだけですべてが機能する。普通はそうだが、SQL同様、追加オプションの設定が必要な場合もある。
次に発表されたのがStructured Parallelism(リンク)で、OpenMPに似たテクニックである。似てはいるが、OpenMPで使われるコンパイラ指示文とは異なり、Microsoftのソリューションは無記名のデレゲートに基づいている。表面的なコード変更は少ない。「for」行に続くコードのブロックという形ではなく、コードは引数として「Parallel.For」関数に渡される。
クエリもしくは反復ループとして簡単に表現できないコード向けには、タスク並列ライブラリ(リンク)がある。一見すると別のスレッドプールにしか見えないが、タスク間で親子関係をサポートする。
アプリケーションに対してより細かい制御が必要な方々には、Coordination Data Structures(参考記事・英語)がある。スレッドセーフのコレクションや、フューチャ、改善された同期オブジェクトを提供する。
原文はこちらです: