アトミックなスレッドセーフシングルトン

Creating a thread-safe C++ Singleton Instance with TBB


C++11から、static変数の初期化がスレッドセーフになったので、もはやシングルトンの実装に排他処理は必要ないのですが、いちおう技術的な資料として引用します。

class Singleton
{
    static tbb::atomic<Singleton *> inst;
    int x;
    int y;
    Singleton(): x(10), y(20) { }
public:
    int getX() {
        return x;
    }
    int getY() {
        return y;
    }
    static Singleton& getInst() {
        if (inst == 0) {
            Singleton* temp = new Singleton();
            if (inst.compare_and_swap(temp, NULL) != NULL) {
                delete temp;
            }
        }
        return *inst;
    }
};
tbb::atomic<Singleton *> Singleton::inst;
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    cilk_for(int i=0; i<8; i++) {
        Singleton s = Singleton.getInst();
        cout << s.getX();
    }
}