template <class T>
bool try_protect(T*& ptr, const atomic<T*>& src) noexcept;
概要
ptrが指すオブジェクトをこのハザードポインタで保護してよいか試み、その後のsrcの値と一致しているかを確認する。
protect()メンバ関数は内部でこの関数を成功するまで繰り返し呼び出す。ロックフリーなアルゴリズムで、保護の設定と再確認を1ステップで行いたい場合に使用する。
テンプレートパラメータ制約
Tはハザードポインタで保護可能 (hazard-protectable) な型であること。
事前条件
*thisが空でないこと。
効果
以下の手順を順に実行する:
- 型
T*の変数oldをptrの値で初期化する。 reset_protection(old)を評価する。src.load(memory_order::acquire)の値をptrへ代入する。old == ptrがfalseの場合、reset_protection()を評価する。
戻り値
old == ptr。すなわち、保護しようとしたポインタが、保護後のsrcの値と一致していればtrue。
例外
投げない
備考
- 戻り値が
falseの場合、ptrにはsrcの新しい値が格納されているので、再度この関数を呼び出して保護を試みることができる。
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- Visual C++: ??