C++1z atomic<T>::is_always_lock_free

C++11時点では、atomic<T>クラステンプレートの非静的メンバ関数としてis_lock_free()が用意されていました。この関数は、T型のatomicオブジェクトがロックフリーに振る舞うかどうかをbool値で返します。この関数が返す値はTの型ごとに静的な値ですが、atomicクラスのオブジェクトを作らないと、そのプロパティを参照できませんでした。

Tがロックフリーに振る舞えるかどうかによって、ユーザーが使用するアルゴリズムが変わる場合があり、そういった状況ではロックフリーに振る舞えるかどうかを静的に取得できるとSFINAEなどを使ってコンパイル時にアルゴリズムの選択ができて便利です。

<atomic>ヘッダで定義されるATOMIC_INT_LOCK_FREEのようなマクロで、型Tがロックフリーに振る舞えるかどうかを静的に取得できるので、それをラップして使いやすくした機能をC++1zで用意することになりました。

C++1zでは、atomicクラステンプレートに、is_always_lock_freeという名前の静的メンバ定数が定義されます。

namespace std {
    template <class T>
    class atomic {
    public:
        static constexpr bool is_always_lock_free = 実装定義;
    };
}

従来のis_lock_free()メンバ関数は、非推奨にはならないようです。

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。