マルチスレッドプログラミング相談室 その8at TECHマルチスレッドプログラミング相談室 その8 - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト713:デフォルトの名無しさん 11/09/23 11:34:40.79 >>708 C#言語仕様もCLRの仕様も、またECMAのCLI仕様においても、 全部「命令のリオーダーが許されるか否か」の視点でしか 記述されてないんだよね。 例えばCLR2.0においては、同一スレッド内の書き込みの順序は 入れ替えられないとされてるようだけど、実行環境がx86であれば それは単に「コンパイラがプログラムを機械語に落としこむときに 書き込み命令の発行順を入れ替えない」とするだけで実現可能。 x86 CPUのメモリモデルは非常に強いので、アウトオブオーダー実行などによって、 ある書き込みが先行する書き込みより先にglobally visibleになることは認められていない。 714:713 11/09/23 11:35:46.25 でも、PowerPCやarmでは事情が違ってくる。 これらのCPUのメモリモデルはx86よりもずっと緩いので、 単に「コンパイラが書き込みの順序を入れ替えない」とするだけだと、 CPUによるリオーダーによって「他スレッドからは書き込み順が 入れ替わったように見える」ことが起こりうる。 一方で、このようなCPUによるリオーダーまでも防ごうとすると、 ほとんどの書き込み命令の間にメモリバリア命令を挟まなきゃ ならなくなる。当然、パフォーマンスの低下はとてつもない。 .NETのメモリモデルって、x86のことしか考えてないように見えるんだよね。 JavaやC++11のメモリモデルは、そういう「リオーダー禁止」とかの 直接的視点ではなく、もっとメタなレベルで「ある書き込みが ある読み込みからはvisibleか否か」を定義してるので、 x86以外のアーキテクチャでも実装しやすくなっている。 今後、マルチコアなWindowsPhoneが出てきたときに いろいろ酷いことになったりしなきゃいいが。 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch