BT

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

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース .NETの Barrierクラスを解説する

.NETの Barrierクラスを解説する

ブックマーク

原文(投稿日:2011/06/15)へのリンク

マルチコアシステムの向上によりこれまで以上に並行と並列プログラミングに関する理解が重要になる。幸いなことに.NET 4は、多くの優れた同期基本命令が開発者に提供されている。一つの基本機能がBarrierであり、Emad Omara氏は、並行マージソートに使用している。

Emad Omara氏の並行マージソートアルゴリズムでは、ソート処理の間、マシンのCPUに完全にアクセスすると仮定する。これは完全に事実とはいえないが、デモンストレーションの目的では役に立つ。入力配列はまず、論理CPUの数と同じ数のN個に同じサイズで荒く分割される。それぞれのCPUでシングルスレッドで自分のパーティションのソートできるように、ひとつのスレッドが起動する。

ここでのポイントは、スレッドは次のフェーズを続ける前に同期しなくてはならないことである。半分のスレッドが隣のパーティションとマージソートを行っている間、もう半分のソートが残ることになる。以前のバージョンの.NETでは、低いレベルの機能で行うか、注意深くThread.Joinを使っていた。Barrierクラスは、もうひとつの選択しである。

Barrierクラスは、すべてのスレッドが完了するのを待つという点で、Thread.Joinにどこか似ている。違いは、待機中のスレッドは、終わらせる必要がないということだ。その代わり、彼らが終わらせた現在のフェーズをひとつにマージして、次に使えるようにする必要がある。この除外によりスレッドの破棄と再作成が必要になる。特に重要なのが、スレッドプールで動作している時だ。

デフォルトでBarrierクラスは、すべてのスレッドが、それが完了して、あらゆるスレッドが次のフェーズの処理を開始する前に合図が必要であると想定する。マージソートの各パスは多くのスレッドの半分が必要なため、明らかにこれでは動作しないだろう。そこでEmad氏は代わりに、シグナル伝達スレッドの期待値を1つ下げるBarrier.RemoveParticipantを呼び出した。

このアルゴリズムは、教育用に設計されており、製品として使うためには、さらなる洗練が必要であるため、注意するべきである。

この記事に星をつける

おすすめ度
スタイル

BT