this C++のDouble Checked Locking Patternについての記事は、volatile
を使用してDCLPを正しく実装する方法の1つを示しています変数:C++でDouble Checked Lockingを実装するには
class Singleton {
public:
static volatile Singleton* volatile instance();
private:
static volatile Singleton* volatile pInstance;
};
// from the implementation file
volatile Singleton* volatile Singleton::pInstance = 0;
volatile Singleton* volatile Singleton::instance() {
if (pInstance == 0) {
Lock lock;
if (pInstance == 0) {
volatile Singleton* volatile temp = new Singleton;
pInstance = temp;
}
}
return pInstance;
}
私は理解していないテキストの抜粋があり、このような例の後:
まず、観察可能な行動上の標準の制約は唯一 のために駅で定義された抽象マシンですその抽象マシン には複数の実行スレッドの概念がありません。 標準並べ替えからコンパイラを防ぎも読み取り、 揮発性データ内スレッドへの書き込み結果として、それは 例えばreorderings 横切るスレッドに全く制約を課しません。少なくとも、それはほとんどのコンパイラ の実装者が物を解釈する方法です。その結果、実際には、多くの コンパイラが上記のソースからスレッドに安全でないコードを生成する可能性があります。
以降:
... C++の抽象機械はシングルスレッドであり、そしてC++コンパイラは とにかく 、上記のようなソースからスレッド安全でないコードを生成することを選択してもよいです。
これらの注釈は、ユニプロセッサでの実行に関連しているため、キャッシュの一貫性に関する問題ではありません。
コンパイラが順序変更することができない場合内スレッド揮発性データへの読み込みと書き込み、それがどのように並べ替えることができますので、スレッドセーフでないコードを生成し、この特定の例のために全体でスレッドを読み込みと書き込み?
volatile Singleton* volatile temp = new Singleton;
pInstance = temp;
中に、::
この記事は2004年のものであり、C++ 11とそれを更新した抽象的なマシンよりもかなり前の年です。 – molbdnilo
@molbdniloしかし、コンパイラが_across_スレッドの読み書きをどのように並べ替えることができますか? – undermind