BT

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

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース メッセージングとスケジューリングで共有データにロック無しでアクセス

メッセージングとスケジューリングで共有データにロック無しでアクセス

ブックマーク

原文(投稿日:2011/04/27)へのリンク

メッセージ・パッシング システムでは、変更可能なデータが多くのタスクで共有されなければならない時がしばしばある。これまでのプログラミングでは、これをリード-ライターブロックによって処理している。そこでは、1つのライター(書き込み)スレッドが共有データを変更している間は、他のすべてのスレッドをブロックする。高パフォーマンスなシステムでは、スレッドをブロックしたくないので代わりのソリューションが必要である。

面白い技法の1つがメッセージ・パッシングAPIとタスク スケジューラのセットを使うことである。データを読むことだけが必要なアクションはタスク スケジューラを使って処理され、使えるコアの数だけ同時にスレッドを動かす。各メッセージが処理されると、そのスレッドは直ちに次のメッセージ処理のために再利用される。

共有データを変更する必要のあるメーッセージは別のタスク スケジューラを使い、これは一度に一つのメッセージだけ処理できる。これは排他的スケジューラとして知られている。

CE Scheduler

TPL Dataflow が「並列-排他的スケジューラ ペア」と呼ぶものを使うと魔法が起きる。このオブジェクトは2つのタスク スケジューラ、1つは並列なタスク用で、もう1つが排他的なタスク用、を組み合わせている。排他的なスケジューラに処理待ちのメッセージがあると、新しいメッセージは並列スケジューラには送られない。並列スケジューラによって使われていたどのスレッドもスレッドプールに戻され、まるで処理すべきメッセージがないかのようにである。排他的スケジューラがすべてのメッセージを処理すると、並列スケジューラが再び起き上がり、スレッドが使えるようになると、処理を再開できる。

この技法によって、リード-ライター ロックにおけるスレッドのブロッキングの問題はなくなるが、この技法を正しく使うには、まだ注意が要る。リーダー-ライター ロックでの場合と同様に、余りに多くのライトメーッセージがあると、リードメッセージを処理することができない。そして、スケジューラの制御下に無い何かが共有データを安全でない方法で変更してしまうリスクも存在する。

この記事に星をつける

おすすめ度
スタイル

BT