BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース 関数型プログラミングとCoordination Data Structures

関数型プログラミングとCoordination Data Structures

Coordination Data Structures (CDS) は.NET 4で計画されている新しいAPIであり、スレッドセーフなオブジェクトや主にコレクションを扱うものだ。そのCDSに、およそ6ヶ月の沈黙を経ていくつかの大きな更新があった。もっとも注目に値するのは関数型プログラミングの手法が導入されたことだ。これによってデザインパターンを使う必要性が軽減される。

最初の新しいクラスはConcurrentLinkedListだ。ConcurrentLinkedListはTryInsertBetweenメソッドでノードの挿入をスレッドセーフに行うのに述語関数を使う。述語関数はそのオブジェクト自身から正しい位置を決めるために呼ばれ、そのクラスを普通の LinkedListよりも、たとえシングルスレッドだとしてもより使いやすくする。
 

関数型の手法が使われている別の箇所はSpinWaitオブジェクトだ。開発者は手作業でループを書いてSpinOnceを繰り返し呼び出す必要はなくなり、SpinWait.SpinUntilに述語関数を渡せばよくなるのだ。

次に取り上げるのは新しい型、ConcurrentBagだ。これはキューのコレクションのようなものだがスレッド間でロードバランスしてくれる。普段は各スレッドは自身のキューを読み書きする。しかしキューが空の場合には、これは他のスレッドのキューからアイテムを取ってくる。つまりほとんど常に、スレッド間の競合が出ることもなく、しかも仕事がある分だけ各スレッドが全力で働くことができるわけだ。ConcurrentBagは ConcurrentQueueの置き換えではない。ConcurrentQueueは依然として単一の生産者、単一の消費者という状況では向いている。
 

WriteOnce クラスは取り除かれた。これは特別興味を惹く機能ではなく、セッターが1回より多く呼ばれると例外を投げるオブジェクトにすぎなかった。もっと有用な LazyとLazyVariableクラスは残された。どちらも遅延初期化をサポートするもので、Futureとしても知られている。前者はクラスベース、後者は軽量だが若干安全性が落ちる構造体である。他には、メモリ使用量が問題となるときに使えるLazyInitializer、型安全にスレッドローカルのストレージとFutureを組み合わせるためのThreadLocalが加わった。

スレッドを止めることなくタスクをキャンセルできるかどうかは依然として重要な課題だ。このキャンセルのサポートのためのオーバーロードが、ブロック可能なすべてのメソッドに追加された。 Microsoftはこのキャンセルのモデルが至るところで利用できるように努めており、これによってライブラリ開発が非常にシンプルになるだろう。

 

より詳しい情報はMicrosoftのParallel Programmingブログ(リンク)および私たちのCDSについての記事(参考記事・英語)を参照してほしい。
 

 

原文はこちらです:http://www.infoq.com/news/2009/03/CDS-March

この記事に星をつける

おすすめ度
スタイル

BT