最終更新日時:
が更新

履歴 編集

function
<hazard_pointer>

std::hazard_pointer::protect(C++26)

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

処理系

関連項目

参照