最終更新日時:
が更新

履歴 編集

function
<hazard_pointer>

std::make_hazard_pointer_batch(C++29)

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

概要

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

batchに含まれる空のhazard_pointerオブジェクトそれぞれに、新しく構築したハザードポインタを所有させる。make_hazard_pointer()を個別に呼び出すよりも、複数のハザードポインタをまとめて構築することでレイテンシを低減できる。

効果

例外が送出された場合、何の効果も持たない (強い例外安全性の保証)。

そうでなければ、batchの各要素eのうちe.empty()trueであるものについて、ハザードポインタを構築し、eをそのハザードポインタの所有者にする。

戻り値

なし

例外

新しく構築するハザードポインタのいずれかのメモリを確保できなかった場合、std::bad_allocを送出する可能性がある。

備考

  • 既に非空 (ハザードポインタを所有している) の要素は変更されない。

#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*> d0{new Data(1)};
std::atomic<Data*> d1{new Data(2)};

int main()
{
  // 2つのハザードポインタをまとめて構築する (個別構築より低レイテンシ)
  std::array<std::hazard_pointer, 2> hp;
  std::make_hazard_pointer_batch(hp);

  // それぞれで別の共有データを保護する
  Data* p0 = hp[0].protect(d0);
  Data* p1 = hp[1].protect(d1);
  std::println("{} {}", p0->value, p1->value);

  // まとめて破棄する
  std::clear_hazard_pointer_batch(hp);

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

出力

1 2

バージョン

言語

  • C++29

処理系

関連項目

参照