マルチスレッドプログラミングとvolatile

マルチスレッドを使った最適化のWEB記事を続けて見かけたのだが、みんなvolaileについてはスルーしているので補足してみる。volatileは変数単位でコンパイラの最適化機能を無効にする修飾詞です。C++にもC#にもJavaにも、主要な言語には大抵用意されています。volatile宣言を忘れると、Releaseビルドでしか発生しない、再現性の低い、達の悪いバグに襲われる事になります。
何故volatile宣言が必要なのかと言うと、最近のコンパイラは高度に最適化作業をおこないます。その結果として、プログラマが記述したとおりの順序で処理を実行しない事もあります。マルチスレッドで特に問題になるのが、命令の順番の入れ替えや、演算処理のループ外への移動です。
例えばループの中でA*B*2という計算をしていたとします。コンパイラは局所的に見て、ループ内で変数Bが変更される可能性が無い事を判断した場合、B*2演算をループの外に移動したりします。すると別スレッドで変数Bの値を変更しても、他スレッドのループ内の演算には反映されないという事になってしまいます。

コンパイラが最適化する前:
int a, b, d;
void funcA(void)
{
while (true)
{
a = funcB();
d = a * b * 2;
}
}

コンパイラが最適化した後:
int a, b, d;
void funcA(void)
{
int e = b * 2;
while (true)
{
a = funcB();
d = a * e;
}
}

実はVisual C++やC#ではstatic変数やグローバル変数を無条件にvolatileな変数として扱うようになっています。スレッド間で共有するような変数の多くはstatic変数やグローバル変数ですから、殆どの場合volatile宣言を忘れていても動いてしまいます。でもそのために、ケアが必要だと言う事も忘れがちなのです。

「クラウドはメリットよりリスクが大きい」…

「クラウドはメリットよりリスクが大きい」、IT専門家の45%
うん、まぁ、そうだよね。
PaaSやSaaSに限れば、サービスの継続性について、他社に依存する事になる。サービスが中止されたときに他社のサービスに移りたいと思っても、アーキテクチャに互換性が無いため、設計レベルからやり直さなければならない。これってかなり大きなリスクだよね。
HaaSやIaaSについては他社へのサービスの乗り換えも可能だけど、これだってクラウドのスケーラビリティの高さに依存した設計をしていたら、クラウド以外の環境には逃げようがないのだ。自前でハードウェアを用意してもいいけど、損益分岐点は跳ね上がってしまうもの。
結局のところ、短期集中でスポット的に利用するシステムじゃないと、なかなか業務でクラウドに載せると言う訳にはいかないよね。

Google App Engineの弱点はバックグランドの処理を作れないこと

Windows Alureの開発経験はまだないけど、セミナーなどで聞いている限りでは、Google App Engineの最大の弱点はバックグランドタスクを作れない事だなぁ・・・と実感する。
Google App Engineにも定周期で処理を起動するcronはあるのだけど、最短でも一分周期が限度。基本的にはCGI経由で呼び出されるのと同じなので、1~2分以内に処理を完了しないと異常終了してしまう。したがってUIに相当する処理と、バックグランドで動作する処理を即時に連携させるような事はできない。
これがWindows Azureならバックグランドで処理をするプロセスを常駐させておき、UIに相当する処理と通信させることができる。
この差が結構大きくて、ログインしている複数のユーザ間でリアルタイムのデータ交換をおこなうようなアプリケーション・・・具体的に言うとゲームとかチャットとか・・・を実装しようとすると結構な問題になる。Data Store上の一つのエンティティにデータを集中させて、そこでトランザクション制御をおこなうぐらいしか手が無い。もちろん、こんな事をすればスケールアウト出来るメリットを放棄する事になるし、ユーザー数にも大きな制限を受ける事になる。
これがWindows Azureならバックグランドで調停をおこなうタスクを複数常駐させて、UIに相当する処理からの要求を順番に調停しながら処理する事も出来るのになぁ・・・。それとも私が見落としているだけで、Google App Engineなりの良い実装方法があるのだろうか?