最終更新日時:
が更新

履歴 編集

function
<hazard_pointer>

std::clear_hazard_pointer_batch(C++29)

namespace std {
  void clear_hazard_pointer_batch(span<hazard_pointer> batch) noexcept; // C++29
}

概要

複数のハザードポインタを、まとめて破棄する。

batchに含まれる非空のhazard_pointerオブジェクトそれぞれが所有するハザードポインタを破棄し、その要素を空にする。個別に破棄するよりも、複数のハザードポインタをまとめて破棄することでレイテンシを低減できる。

make_hazard_pointer_batch()で構築したハザードポインタ群をまとめて破棄する用途に使用する。

効果

batchの各要素eについて、e.empty()falseであるものは、eが所有するハザードポインタを破棄し、eを空にする。

破棄されたハザードポインタが保護していたオブジェクトは、他に保護しているハザードポインタがなければ回収可能となる。

戻り値

なし

例外

投げない

備考

  • 既に空の要素は変更されない。

#include <hazard_pointer>
#include <array>
#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::array<std::hazard_pointer, 2> hp;
  std::make_hazard_pointer_batch(hp);

  Data* p = hp[0].protect(data);
  std::println("{}", p->value);

  // 使い終わったハザードポインタ群をまとめて破棄する
  std::clear_hazard_pointer_batch(hp);

  // 後始末: 共有データを回収予約する
  data.load()->retire();
}

出力

42

バージョン

言語

  • C++29

処理系

関連項目

参照