Skip to content
2009/07/05 / highmt

メモリバリアの使い方のメモ

読めば思いだすのだけれどもまたすぐ忘れてしまうということを何度も繰り返しているのでメモ。

Double-Checked Locking, Threads, Compiler Optimizations, and More
http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf

  • DCLPの問題は、
    – メモリ確保
    – オブジェクトを構築
    – 構築したオブジェクトのアドレスを公開
    の3つのフェースが想定どおりの順序で行われるとは限らないこと。
    たとえば、メモリ確保->アドレスを公開->構築の順序で実行されると
    初期化されていないオブジェクトにアクセスしてしまう。
    volatileは(コンパイラが配慮しない限り)役に立たない。たとえばインライン化。
  • 順序を保証するためにメモリバリアを入れる。
    これは、コンパイラに対する最適化抑制指示(静的な制約)であると同時に、
    CPUに対する命令順序並び換えの抑制指示(動的な制約)となる。
    – 読み込み側:アドレス取得前の時点のオブジェクトを取得しないことを保証する
      – アドレス取得 –> メモリバリア(リード、acquire) –> オブジェクト取得
    – 書き込み側:オブジェクト構築前にアドレスを公開しないことを保証する
      – オブジェクト構築 –> メモリバリア(ライト、release) –> アドレス公開
    読み込み側、書き込み側両方でやらないといけない。
広告
%d人のブロガーが「いいね」をつけました。