template <class T>
T* protect(const atomic<T*>& src) noexcept;
概要
アトミックオブジェクトsrcが現在指しているオブジェクトを、このハザードポインタで保護する。
保護に成功すると、srcが指していたオブジェクトは、この保護が解除されるまで、retire()されても回収されない。
テンプレートパラメータ制約
Tはハザードポインタで保護可能 (hazard-protectable) な型であること。
事前条件
*thisが空でないこと。
効果
以下と等価である:
T* ptr = src.load(memory_order::relaxed);
while (!try_protect(ptr, src)) {}
return ptr;
戻り値
保護したオブジェクトを指すポインタ。
例外
投げない
例
#include <hazard_pointer>
#include <atomic>
#include <print>
struct Data : std::hazard_pointer_obj_base<Data> {
int value;
explicit Data(int v) : value(v) {}
};
std::atomic<Data*> data{new Data(42)};
int main()
{
std::hazard_pointer h = std::make_hazard_pointer();
// data が指すオブジェクトを保護して安全に参照する
Data* p = h.protect(data);
std::println("{}", p->value);
// 後始末: 共有データが指すオブジェクトを回収予約する
data.load()->retire();
}
出力
42
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- Visual C++: ??