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()
メンバ関数は、非推奨にはならないようです。
参照
- N4509
constexpr atomic<T>::is_always_lock_free
- P0152R0
constexpr atomic<T>::is_always_lock_free
- P0152R1
constexpr atomic<T>::is_always_lock_free
- LWG1146 / N2992:
static constexpr bool atomic::is_lock_free()
- ISO C++ Standard - Discussion
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。