BT

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

| 作者: Jonathan Allen フォローする 527 人のフォロワー , 翻訳者 尾崎 義尚 フォローする 0 人のフォロワー 投稿日 2011年6月21日. 推定読書時間: 1 分 |

原文(投稿日: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を呼び出した。

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

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT